结果代码始终为0,因为卸载了Android中的Intent

时间:2012-12-21 14:40:31

标签: android android-intent android-activity

从我的应用程序中我尝试使用代码

卸载应用程序
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE);
uninstallIntent.setData(Uri.parse("package:" +packageName));
uninstallIntent.setAction(Intent.ACTION_VIEW);
startActivityForResult(uninstallIntent,UNINSTALL_APPLICATION);

根据我开始结果的活动,我想根据用户的输入执行不同的操作,如取消或点击 ok

正如我所料,单击确定的结果代码为RESULT_OK,点击取消将为RESULT_CANCEL,但实际上在两种情况下我都会RESULT_CANCEL

那么如何区分用户的输入呢。

谢谢!

3 个答案:

答案 0 :(得分:9)

经过深思熟虑后,我终于得到了解决方案。

我是如何在调用卸载意图时实现的,我已使用

将包名保存在首选项文件中
SharedPreferences prefs;
prefs.edit().putString(DELETE_PACKAGE_NAME, packageName).commit();

我在OnActivityresult中所做的事情我刚检查了保存包名称的应用程序是否仍然存在,如果它意味着用户点击了取消,否则他点击确定

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

 if(requestCode==DELETE_APP){

    String requestedPackageName=prefs.getString(DELETE_PACKAGE_NAME, "");

    boolean isPresent=GCMIntentService.isAppPresent(requestedPackageName, this);

    if(isPresent){

      //user Clicked on Cancel
    }else{

      //user Clicked on Ok
    }


 }

}

检查应用程序存在的代码

public static boolean  isAppPresent(String packageName,Context context) {


  try{
    ApplicationInfo info = context.getPackageManager().getApplicationInfo(packageName, 0 );
    return true;

} catch( PackageManager.NameNotFoundException e ){

   return false;
}

 }

感谢。

<强>更新:

平台发生了很大的变化,因为我在这里回答的是更新

现在你可以使用一个intent来明确定义它是否应该返回结果

val intent = Intent(Intent.ACTION_UNINSTALL_PACKAGE).apply {
            data = Uri.parse("package:$packageName")
            putExtra(Intent.EXTRA_RETURN_RESULT, true)
        }
        startActivityForResult(intent, YOUR_REQUEST_CODE_HERE)

文档:https://developer.android.com/reference/android/content/Intent.html#ACTION_UNINSTALL_PACKAGE

这将返回一个结果

来自文档:

  

返回的结果代码将成功或者是Activity.RESULT_OK   失败时Activity.RESULT_FIRST_USER。

启动API 21 Android添加了辅助方法

PackageInstaller.uninstall (String packageName, 
                IntentSender statusReceiver)

详细了解以下链接中的更改,从Android Q开始,上述更新方法也已弃用。

https://developer.android.com/reference/android/content/pm/PackageInstaller.html#uninstall(java.lang.String,%20android.content.IntentSender)

答案 1 :(得分:4)

the APIACTION_DELETE不会返回任何内容。如果未返回任何内容,则结果状态将为RESULT_CANCEL

您最好的选择是设置Intent Filter / Broadcast Receiver收听ACTION_PACKAGE_FULLY_REMOVED意图。关于此前问过的here有一个问题。

答案 2 :(得分:1)

试试这个

Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
intent.setData(Uri.parse("package:" + packageName));
intent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
startActivityForResult(intent, Constants.FROM_UNINSTALL);