Как узнать, какое приложение или кнопку нажал пользователь в окне выбора приложения? - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь сделать клон приложения Uber Driver.Я рассмотрел эту часть, когда после получения уведомления о запросе клиента приложение предложит пользователю выбрать приложение для выбора стороннего приложения (например, Google Map или 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, он продолжит открывать другое действие.

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


    if(isBack){

        // Proceed to open another actvity

        isBack = false;
    }

}

Однако это не будет работать, если пользователь нажмет ОтменаКнопка .

Снимок экрана приложения Chooser

image

Я пытался использовать 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 Ответ

0 голосов
/ 28 ноября 2018

После некоторого поиска я нашел этот ответ в здесь .

Это мой обновленный код намерения:

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();
        }
    }
}
}
...