【问题标题】:Android INJECT_EVENTS permission on a rooted devce根设备上的 Android INJECT_EVENTS 权限
【发布时间】:2017-07-14 00:47:51
【问题描述】:

我正在尝试创建一个电视盒应用程序,该应用程序将在后台运行服务并接收来自远程应用程序的信号。电视盒应用程序和远程应用程序通过 TCP 相互通信。这将能够将事件注入到正在运行的任何活动中。但是我无法通过调用 Intent 将事件注入不属于我的应用程序的 Activity。喜欢打开wifi设置并选择所需的wifi。但是,如果我在没有运行应用程序的活动的情况下尝试执行此操作,我会收到一个权限错误,指出我没有 INJECT_EVENTS 权限。我已将此权限添加到我的清单中,如下所示:

<uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>

虽然它仍然抛出相同的权限异常。经过一番搜索,我得到了答案,为了获得 INJECT_EVENTS 权限,您的应用程序必须使用与系统签名相同的签名。但是我不清楚这到底意味着什么。有没有一种方法可以在我无法访问相同签名的情况下保持中间状态。

【问题讨论】:

    标签: android permissions


    【解决方案1】:

    虽然它仍然抛出相同的权限异常。经过一番搜索,我得到了答案,为了获得 INJECT_EVENTS 权限,您的应用程序必须使用与系统签名相同的签名。但是我不清楚这到底意味着什么。有没有一种方法可以在我无法访问相同签名的情况下保持中间状态。

    /system/app中安装您的应用

    [正如您所说,您将为您的应用授予用户 root 访问权限]

    而且,以 root 身份运行的应用不需要任何正常的 Android android 权限,因为它已经获得了可用的最高级别权限

    1。首先,获取apk在系统中所在的位置,放到sdcard中。

    final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    List<ResolveInfo> apps = getPackageManager().queryIntentActivities(mainIntent, 0);
    for (ResolveInfo info : apps) {
    
        File fx = new File(info.activityInfo.applicationInfo.publicSourceDir);
    
        if(fx.getName().toString().contains(getApplicationContext().getPackageName())){
    
        File fz = new File(Environment.getExternalStorageDirectory().toString());   
        fz.mkdirs();            
        fz = new File(fz.getPath()+"/"+getApplicationContext().getPackageName()+".apk");
        fz.createNewFile();
    
        InputStream in = new FileInputStream(fx);
    
        OutputStream out = new FileOutputStream(fz);
    
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0){
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
      }
    }
    

    2。执行以下命令将/system目录重新挂载为读/写,并将应用程序从SDCARD安装到/system/app目录,其中system:

    Runtime.getRuntime.exec("su -c mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system");
    
    String x = getApplicationContext().getPackageName();
    Runtime.getRuntime.exec("su -c cp /sdcard/"+x+".apk /system/app");
    
    Runtime.getRuntime.exec("su -c reboot");
    

    现在,尝试执行您的代码并发表评论。

    【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2011-07-19
    • 2014-02-27
    • 1970-01-01
    • 2011-12-25
    • 2023-02-04
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多