发送从C ++的意图的java Android中5.0.1_r1(Sending an intent

2019-10-22 04:24发布

通过几个职位去之后,我想通了,我可以与下面的代码行(用于调试第二行)发送的意图:

int ret = system("am broadcast -a android.intent.action.MIKE_ACCESSED --user 0"); 

__android_log_print(ANDROID_LOG_DEBUG, "gxp18", "Shell command returned %i", ret);

不幸的是,这个总是返回(不管是什么系统(使用命令“...”)):

Shell命令返回32512

有趣的是,我能顺利通过利用亚行派的意图:

adb shell am broadcast -a android.intent.action.MIKE_ACCESSED

注意! 我不使用NDK。 我在后报告的代码段是在Android框架一个代码的一部分的变形例。 特别是,它是Android服务的一个组成部分。 我与AOSP工作和修改源代码的一部分。

Answer 1:

正如我记得,你不能直接在您的应用程序由于是Android 5.0版本的权限检查执行am命令。

这两种情况是不同的。 从外壳程序执行命令有壳UID和GID,这就好比以下。

uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:shell:s0

你在你的代码做的命令system()调用与您的应用程序的UID和GID它与外壳的UID和GID比较少的权限执行。

所以,你会失败的代码结束。 您可以优化您的设计,从Java代码发送此意图。 如果你坚持你的JNI做的,更好的解决方案可能会调用自己的一个静态无效的方法Application 。 这样一来,你就不必担心Context这是不是在JNI大部分时间访问。

public class MyApplication extends Application {

   private static Context context;

   @Override
   public void onCreate() {
       super.onCreate();
       context = this;
    }

    public static void sendIntent() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("http://www.google.com"));
        context.startActivity(intent);
    }
}


Answer 2:

1)禁用SELinux(设置在允许模式)2)修改ActivityManagerNative.java绕过用户id检查

请享用 :)



文章来源: Sending an intent from c++ to java in Android 5.0.1_r1