2012-05-07 61 views
13

我想在按钮单击时卸载我的应用程序。为此,我使用以下代码。以编程方式删除我的应用程序(Android)

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

它给我造成的,但我希望的情况下直接点击与信息对话框“此应用程序将被卸载”的“确定”按钮即可删除。

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

+2

您需要有root权限才能做到这一点。 – xDragonZ

+2

这种东西是为系统应用程序保留的,因为很好的原因 - 所以你坚持让你的设备生根。 – Jens

+1

我认为你应该退一步思考为什么你会想要这样做。为什么你需要重写删除应用程序的标准方法? – kcoppock

回答

11

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

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

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 

    } 
} 
相关问题