我正在尝试创建一个电视盒应用程序,它将在后台运行一个服务,并从远程app.Tv盒应用程序接收信号,远程应用程序通过TCP相互通信。这将能够将事件注入正在运行的任何活动中。但是我无法通过调用Intent将事件注入到不属于我的应用程序的Activity中。喜欢打开wifi设置并选择所需的wifi。但是,如果我尝试在没有运行应用程序的活动的情况下执行此操作,则会收到权限错误,指出我没有INJECT_EVENTS权限。我已将此权限添加到我的清单中:
<uses-permission android:name="android.permission.INJECT_EVENTS"></uses-permission>
但它仍然抛出相同的权限异常。经过一些搜索,我得到了答案,为了获得INJECT_EVENTS权限,您的应用必须使用与系统签名相同的签名进行签名。但我不清楚这究竟是什么意思。有没有办法可以实现这一目标,我无法访问相同的签名。
答案 0 :(得分:0)
但它仍然抛出相同的权限异常。经过一些搜索,我得到了答案,为了获得INJECT_EVENTS权限,您的应用必须使用与系统签名相同的签名进行签名。但我不清楚这究竟是什么意思。有没有办法可以实现这一目标,我无法访问相同的签名。
在/system/app
[正如您所说,您将为您的应用授予用户root访问权限]
并且,以root身份运行的应用程序不需要任何正常的Android Android权限,因为它已被授予最高级别的权限
<强> 1 即可。首先,获取apk位于系统中的位置并将其放入SD卡。
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");
现在,尝试执行您的代码并发表评论。