以编程方式删除我的应用程序(Android)

问题描述 投票:14回答:3

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

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

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

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

android uninstall
3个回答
11
投票

不允许用户确认卸载不允许第三方应用程序。

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


1
投票

你应该首先看看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


0
投票

是的,可以在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

    }
}
© www.soinside.com 2019 - 2024. All rights reserved.