我如何知道用户在应用选择器中点击了哪些应用或按钮?

Posted

技术标签:

【中文标题】我如何知道用户在应用选择器中点击了哪些应用或按钮?【英文标题】:How can I know what app or button user has clicked in the app chooser? 【发布时间】:2019-03-31 01:56:35 【问题描述】:

我正在尝试克隆 Uber Driver 应用程序。 我得到了这一部分,在收到客户的请求通知后,应用程序将提示应用程序选择器,让用户在用户选择接受客户的请求后选择哪个 3rd 方应用程序(例如谷歌地图或 Waze)导航到客户的位置。

public static final int APP_CHOOSER_LOCATION = 101;

acceptBtn.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 

            String uri = "geo:" + locationInfo.getLatitude() + ","
                    +locationInfo.getLongitude() + "?q=" + locationInfo.getLatitude()
                    + "," + locationInfo.getLongitude();
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
            startActivityForResult(intent, APP_CHOOSER_LOCATION);

            isBack = true;

        
    );

所以问题是我怎么知道用户已经完成了他/她的导航? 我目前的解决方案是放置一个指标isBack。默认为false。当用户点击接受时,isBack 设置为true。 所以,在onResume函数中,如果isBack等于true,就会继续打开另一个activity。

@Override
public void onResume()
    super.onResume();


    if(isBack)

        // Proceed to open another actvity

        isBack = false;
    


但是,如果用户单击取消按钮,这将不起作用。

应用选择器屏幕截图

我尝试使用onActivityResult,但无论我点击什么应用,resultCode 总是显示 0(或 RESULT_CANCELED)。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);

    Log.i(TAG, "in onActivityResult ");
    Log.i(TAG, "resultCode:: "+resultCode);

    if (requestCode == APP_CHOOSER_RESPONSE)
        if(resultCode == RESULT_OK)

            Log.i(TAG, "user select app ");
            if(isBack)
                // Proceed to open another activity

                isBack = false;
            
        

        if(resultCode == RESULT_CANCELED)
            Log.i(TAG, "is cancelled by user ");
            isBack = false;
        
    

我的方法错了吗?还是我错过了代码中的任何内容? 我被困在这里,我不知道如何继续。任何建议表示赞赏。

【问题讨论】:

【参考方案1】:

经过一番挖掘,我在here找到了这个答案。

这是我更新的意图代码:

acceptBtn.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View view) 

        // always initialise app_name to be empty whenever the button is clicked
        Constant.APP_NAME = "";

        //  a “share” Intent
        Intent mapIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));

        // a “receiver” Intent
        Intent receiver = new Intent(getApplicationContext(), AppSelectorReceiver.class);

        //one PendingIntent
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, receiver,
                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_ONE_SHOT);

        // Set appChooser Intent
        Intent chooser = Intent.createChooser(mapIntent, null, pendingIntent.getIntentSender());

        startActivity(chooser);

    
 );

在 onResume 函数中,我检查用户是否点击了任何应用程序:

@Override
public void onResume()
    super.onResume();

    if(!Constant.APP_NAME.isEmpty())

        Log.i(TAG, "User choose: "+ Constant.APP_NAME);

        // Proceed to do something here

    


这是我的 AppSelectorReceiver 类:

public class AppSelectorReceiver extends BroadcastReceiver 

@Override
public void onReceive(Context context, Intent intent) 

    for (String key : Objects.requireNonNull(intent.getExtras()).keySet()) 
        try 
            ComponentName componentInfo = (ComponentName) intent.getExtras().get(key);
            PackageManager packageManager = context.getPackageManager();
            assert componentInfo != null;
            String appName = (String) packageManager.getApplicationLabel(packageManager.getApplicationInfo(componentInfo.getPackageName(), PackageManager.GET_META_DATA));

            Constant.APP_NAME = appName;
        catch (Exception e) 
            e.printStackTrace();
        
    


【讨论】:

以上是关于我如何知道用户在应用选择器中点击了哪些应用或按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道我的应用何时聚焦或不聚焦——反应原生?

Xamarin.Forms Android DatePicker / TimePicker按钮侦听器

Android:如何从日期和时间选择器中获取值

隐藏按钮直到选择图片

NX二次开发-BlockUI点击任意button,实现确定应用按钮变灰色或非灰色

Objective C - 如何检测用户点击了不允许访问照片按钮