15

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

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

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

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

4

3 回答 3

11

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

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

于 2012-05-07T14:14:27.033 回答
5

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

    }
}
于 2016-09-29T05:03:40.703 回答
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“设备所有者静默安装和卸载应用程序” - Android M Preview

于 2018-09-06T16:27:06.943 回答