【问题标题】:Delete my application programmatically (Android)以编程方式删除我的应用程序 (Android)
【发布时间】:2012-05-16 01:03:42
【问题描述】:

我想在单击按钮时卸载我的应用程序。为此,我使用以下代码。

Uri packageURI = Uri.parse("package:"+packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
startActivity(uninstallIntent);

它给了我结果,但我想直接删除而不点击对话框的“确定”按钮并显示“此应用程序将被卸载”。

我只想直接卸载应用程序。

【问题讨论】:

  • 你需要有root权限才能这样做。
  • 这种东西是为系统应用程序保留的,有充分的理由 - 所以你被困在你的设备上。
  • 我认为你应该退后一步,想想你为什么要这样做。为什么需要覆盖删除应用程序的标准方法?
  • @xDragonZ 你知道如何获得root权限吗?这是关于设备的生根,你能指导我如何为生根设备编码。
  • @amity 只需执行命令su 并在该进程中拥有root 权限:Process p = Runtime.getRuntime().exec("su"); 请参阅此blog 帖子以获取完整示例。

标签: android uninstallation


【解决方案1】:

不允许在未经用户确认的情况下卸载第三方应用程序。

正如 xDragonZ 指出的那样,根进程可以通过删除目录并让包管理器来处理丢失来粗略地做到这一点,但这不是一个可广泛部署的解决方案,因为 AFAIK 没有设备为应用程序提供该功能运行他们自己的根助手进程 - 这是一个有风险的售后修改。

【讨论】:

    【解决方案2】:

    是的,可以在 Android 中卸载软件包。此外,您还可以跳过要求用户在卸载屏幕上按 OK 按钮。您可以使用 Android 中的辅助功能服务来实现。

    public class MyAccessibilityService extends AccessibilityService {
        private static final String TAG = MyAccessibilityService.class
                .getSimpleName();
    
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {
            Log.i(TAG, "ACC::onAccessibilityEvent: " + event.getEventType());
    
            //TYPE_WINDOW_STATE_CHANGED == 32
            if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event
                    .getEventType()) {
                AccessibilityNodeInfo nodeInfo = event.getSource();
                Log.i(TAG, "ACC::onAccessibilityEvent: nodeInfo=" + nodeInfo);
                if (nodeInfo == null) {
                    return;
                }
    
                List<AccessibilityNodeInfo> list = nodeInfo
                        .findAccessibilityNodeInfosByViewId("com.android.settings:id/left_button");
                for (AccessibilityNodeInfo node : list) {
                    Log.i(TAG, "ACC::onAccessibilityEvent: left_button " + node);
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
    
                list = nodeInfo
                        .findAccessibilityNodeInfosByViewId("android:id/button1");
                for (AccessibilityNodeInfo node : list) {
                    Log.i(TAG, "ACC::onAccessibilityEvent: button1 " + node);
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
            }
    
        }
    
        @Override
        public void onServiceConnected() {
            Log.i(TAG, "ACC::onServiceConnected: ");
        }
    
        @Override
        public void onInterrupt() {
            // TODO Auto-generated method stub
    
        }
    }
    

    【讨论】:

    • 请注意,这仅对已使用辅助功能服务的应用有用。否则它是没有用的,因为提示用户启用无障碍服务给他们带来的不便不仅仅是在卸载对话框上按“确定”。
    【解决方案3】:

    您应该首先查看 Android 原生 PackageInstaller。我建议你更新你使用的所有代码。


    下一步是检查PackageInstaller,这是一个普通类。你会在那里找到uninstall 函数。坏消息是这需要Manifest.permission.DELETE_PACKAGES 权限并且它只授予系统应用程序。这意味着其他开发人员无法直接使用它。但我们可以使用设备所有者权限访问它。


    这需要:

    • Android 6.0 或更新版本
    • 卸载包的设备所有者权限

    一般DELETE_PACKAGES 权限表示:

    允许应用程序删除包。

    不适用于第三方应用程序。

    一旦您的应用获得设备所有者权限,您就可以像这样卸载软件包:

    String appPackage = "com.your.app.package";
    Intent intent = new Intent(getApplicationContext(), 
    getApplicationContext().getClass()); //getActivity() is undefined!
    PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0);
    PackageInstaller mPackageInstaller = 
    getActivity().getPackageManager().getPackageInstaller();
    mPackageInstaller.uninstall(appPackage, sender.getIntentSender());
    

    此处使用的代码:

    PackageInstaller "Silent install and uninstall of apps by Device Owner” - Android M Preview

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 2014-06-22
      • 1970-01-01
      • 2012-11-03
      • 2010-11-01
      相关资源
      最近更新 更多