我如何知道用户在应用程序选择器中单击了哪个应用程序或按钮?
How can I know what app or button user has clicked in the app chooser?
我正在尝试制作 Uber Driver 应用程序的克隆。
我已经涵盖了这部分内容,在收到客户的请求通知后,该应用程序将提示一个应用程序选择器,供用户选择在用户选择后导航到客户位置的第 3 方应用程序(例如 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;
}
});
所以问题是我如何知道用户已完成 his/her 导航?
我目前的解决方案是放置一个指标 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;
}
}
}
是我的做法错了吗?还是我错过了代码中的任何内容?
我被困在这里,我不知道如何进行。任何建议表示赞赏。
经过一番挖掘,我在 中找到了这个答案。
这是我更新的意图代码:
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 class:
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();
}
}
}
}
我正在尝试制作 Uber Driver 应用程序的克隆。 我已经涵盖了这部分内容,在收到客户的请求通知后,该应用程序将提示一个应用程序选择器,供用户选择在用户选择后导航到客户位置的第 3 方应用程序(例如 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;
}
});
所以问题是我如何知道用户已完成 his/her 导航?
我目前的解决方案是放置一个指标 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;
}
}
}
是我的做法错了吗?还是我错过了代码中的任何内容? 我被困在这里,我不知道如何进行。任何建议表示赞赏。
经过一番挖掘,我在
这是我更新的意图代码:
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 class:
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();
}
}
}
}