【问题标题】:Result Code is always 0 as result of uninstallation Intent in android由于android中的卸载意图,结果代码始终为0
【发布时间】:2012-12-09 03:34:42
【问题描述】:

我正在尝试使用代码从我的应用程序中卸载应用程序

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

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

谢谢!

【问题讨论】:

  • @SalmonKP 答案对我有用。但我必须先添加 REQUEST_DELETE_PACKAGES 权限。

标签: android android-intent android-activity


【解决方案1】:

根据the APIACTION_DELETE 不返回任何内容。如果没有返回任何内容,则结果状态将为RESULT_CANCEL

最好的办法是设置一个Intent Filter/Broadcast Receiver 监听ACTION_PACKAGE_FULLY_REMOVED 意图。以前问过的here有一个问题。

【讨论】:

  • 那么还有其他方法可以检测到这个东西吗??
  • 看我的编辑,基本上你想设置一个意图过滤器来监听ACTION_PACKAGE_FULLY_REMOVED
  • 但在这种情况下,我们只有在用户点击确定时才会得到响应,那么取消呢??
  • 我会做的是你已经做过的,但是添加广播接收器。如果你检测到它,你知道用户点击了 OK,如果你没有检测到它,他们点击了取消。如果您解释了为什么要检测用户是否点击取消,这将有所帮助...
  • 实际上,如果他取消,我想给用户三次尝试。正如你所建议的,我还认为有些问题是我将如何知道用户是否单击取消,因为它不会到达接收器所以为了实现这一点,我需要设置一个计时器来检查响应是否收到。
【解决方案2】:

经过深思熟虑,我终于找到了一个棘手的解决方案。

在调用卸载意图时我是如何实现的,我已通过使用将包名称保存在首选项文件中

SharedPreferences prefs;
prefs.edit().putString(DELETE_PACKAGE_NAME, packageName).commit();

我在 OnActivityresult 中所做的我刚刚检查了保存包名称的应用程序是否仍然存在,如果这意味着用户点击了 Cancel 否则他点击了 Ok .

@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;
}

 }

谢谢。

更新:

自从我回答这个问题后平台发生了很大变化,这是更新

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

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

这将返回一个结果a

来自文档:

成功时返回的结果代码将为 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)

【讨论】:

【解决方案3】:

试试这个

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多