5

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

Intent uninstallIntent = new Intent(Intent.ACTION_DELETE);
uninstallIntent.setData(Uri.parse("package:" +packageName));
uninstallIntent.setAction(Intent.ACTION_VIEW);
startActivityForResult(uninstallIntent,UNINSTALL_APPLICATION);

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

正如我预期的那样,单击 ok 的结果代码将是RESULT_OK,单击 cancel 将是RESULT_CANCEL,但实际上在这两种情况下我都得到了RESULT_CANCEL

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

谢谢!

4

3 回答 3

12

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

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

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

这将返回一个结果

从文档中:

返回的结果代码将是 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)

于 2013-01-01T14:18:13.223 回答
4

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

最好的办法是设置一个意图过滤器/广播接收器来监听 ACTION_PACKAGE_FULLY_REMOVED意图。这里有一个关于以前问过的问题。

于 2012-12-21T14:42:58.123 回答
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);
于 2017-07-10T10:17:01.027 回答