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

时间:2012-05-07 14:03:25

标签: android uninstall

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

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

它给了我结果,但我想直接删除而不点击" Ok"带有消息&#34的对话框按钮;此应用程序将被卸载"。

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

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分: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

答案 2 :(得分: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

    }
}