使用system(am broadcast -a nova.android.hdmi.plugout)发广播(相关搜索:c语言)

在c语言层 ,使用system(am broadcast -a nova.android.hdmi.plugout)发广播,java层监听不到,是需要什么权限吗?

疑惑点:c语言修改的代码可执行程序是在vendor/bin下面放着,而am发广播是在system/bin下面,所以,广播一直发不出去;

求问:vendor/bin下面可执行程序需要发广播,但是要调用到system/bin下面的am 来发广播,如何修改呢?

不能在vendor下执行,放到system下就可以了

java层配置文件中注册这个广播了吗?

引用chatgpt内容作答:
在Android系统中,广播的发送和接收涉及到权限、组件注册以及应用的上下文等问题。从你的问题描述来看,以下是一些可能导致你的问题的因素:

1、权限: 在发送广播时,系统可能需要特定的权限。检查一下你的 C 语言可执行程序是否有发送广播所需的权限。通常情况下,发送系统级别的广播可能需要系统签名级别的权限。

2、上下文: 在 Android 中,广播是基于应用的上下文的。也就是说,一个应用发送的广播通常只能被具有相应权限并且注册了对应广播的组件所接收。确保你的 C 语言可执行程序在正确的上下文中运行,以便能够发送广播。

3、注册广播接收器: 要确保 Java 层已经正确地注册了对应广播的接收器。你提到在 Java 层使用 adb shell am broadcast -a nova.android.hdmi.plugout 命令可以接收广播,这可能是因为你手动触发的广播会被接收器捕获。但是在正常情况下,你需要确保你的应用程序已经正确地注册了该广播的接收器。

4、广播的 Package 名称: 在发送广播时,通常需要指定广播的 Package 名称,以确保广播只发送给特定的应用程序。你可以尝试在发送广播时指定 Package 名称,如:am broadcast -a nova.android.hdmi.plugout -n com.example.myapp/.MyBroadcastReceiver,其中 com.example.myapp 是接收广播的应用程序的包名,MyBroadcastReceiver 是接收广播的组件类。

5、SELinux 限制: Android 中的 SELinux 策略可能会影响可执行程序的权限。确保你的 C 语言可执行程序在 SELinux 的策略下有足够的权限来发送广播。

6、日志调试: 你可以查看系统日志(Logcat)以获取更多关于广播发送和接收的信息,从而找出问题所在。

参考gpt:
结合自己分析给你如下建议:
1.你需要在你的应用中注册一个 BroadcastReceiver 来接收系统广播,例如 HDMI 插拔的广播。你可以在 AndroidManifest.xml 文件中声明你的 BroadcastReceiver,并指定它要接收的 Intent action,例如 nova.android.hdmi.plugout。你还需要在你的 BroadcastReceiver 的 onReceive 方法中处理接收到的广播,例如获取广播中携带的数据或执行相应的操作。
2.你需要使用正确的格式来使用 adb shell am broadcast 命令来发送广播。你需要指定 -a 参数来指定 Intent action,例如 nova.android.hdmi.plugout。你还可以使用 -n 参数来指定目标组件,例如 com.example.app/.MyReceiver。如果你要发送带有数据的广播,你还可以使用 -e 参数来指定额外的字符串数据,例如 -e name value。
3.你需要注意一些可能导致广播发送或接收失败的原因,例如:
你的应用没有申请必要的权限,例如 android.permission.BROADCAST_STICKY 或 android.permission.RECEIVE_BOOT_COMPLETED。
你的应用没有在前台运行,或者被系统杀死或休眠,导致无法接收隐式广播。
你的广播发送或接收的 Intent action 不匹配,或者包含了不必要的 category 或 data。
你的广播发送或接收的组件名不正确,或者没有在 AndroidManifest.xml 文件中声明。

一、可以参考下这篇文章:

二、以下回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在C语言层面使用system("am broadcast -a nova.android.hdmi.plugout")发送广播,并且Java层无法监听到的问题可能与权限相关。在Android系统中,广播需要相应的权限才能被接收到。你需要确保你的应用程序在AndroidManifest.xml文件中声明了正确的权限。

要在C语言层发送广播,你的应用程序需要具有android.permission.BROADCAST_STICKY权限。请确保你的AndroidManifest.xml文件中包含以下权限声明:

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

此外,你还需要确保你的应用程序是有权发送该广播的。如果你的应用程序没有声明该广播的权限,它将无法发送该广播。你可以在AndroidManifest.xml文件中添加以下代码声明你的应用程序的权限:

<permission
    android:name="your.package.name.permission.YOUR_PERMISSION"
    android:protectionLevel="signature" />

然后,在发送广播之前,你需要在你的C代码中请求该权限:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {
    // 请求权限
    system("pm grant your.package.name your.package.name.permission.YOUR_PERMISSION");

    // 发送广播
    system("am broadcast -a nova.android.hdmi.plugout");

    return 0;
}

请将your.package.name替换为你的应用程序的包名,并将your.package.name.permission.YOUR_PERMISSION替换为你自定义的权限名称。

请注意,广播的发送和接收涉及到Android系统的机制和权限控制,因此在进行相关操作时,应仔细阅读Android官方文档并确保权限配置正确。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

需要在C语言层使用system("am broadcast -a nova.android.hdmi.plugout --user 0")来发送广播,这样Java层才能监听到。然后在AndroidManifest.xml文件中添加这个权限,你试试呢

system("system/bin/am broadcast -a nova.android.hdmi.plugout")
需要加system/bin 绝对路径,好像也不行,再想想,大哥

【以下回答由 GPT 生成】

回答:

是的,使用system(am broadcast -a nova.android.hdmi.plugout)在C语言层发广播需要特定的权限才能执行这个操作。具体来说,你需要在AndroidManifest.xml文件中声明android.permission.BROADCAST_STICKY权限。该权限允许应用程序发送黏性广播,这样即使应用程序已经退出或被关闭,接收者也能够在设备重新启动后接收到广播。

下面是一个示例的AndroidManifest.xml文件的权限声明部分:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

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

    <application
        ...>

        ...

    </application>

</manifest>

在代码中使用system()函数执行命令的权限是受限制的。为了绕过这个限制,你可以在代码中使用su命令以root权限执行am broadcast命令。下面是一个示例的C代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    system("su -c 'am broadcast -a nova.android.hdmi.plugout'");
    return 0;
}

这样,当你运行C代码时,它将使用root权限执行am broadcast命令,从而发送广播。请确保你的设备已经root,并且已经安装了superuser或类似的root管理应用。

希望以上信息能对你有帮助。如果你还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

试试这个
https://blog.csdn.net/takashi77/article/details/108552782

Java 层的 BroadcastReceiver 是通过 Context 来注册的。在 C 语言层面调用 system 函数发送广播可能无法得到适当的 Context。还要确保您的广播的 Action 与 BroadcastReceiver 的过滤器中的 Action 匹配。

最好把代码发出来看一下。

在Android中,发送广播需要在应用的上下文中使用合适的方法来执行,直接在C语言层使用system命令执行广播是不够的。am命令是Activity Manager的一部分,但它需要在Android系统中运行,并且需要合适的环境。

如果你想在C语言层通过JNI(Java Native Interface)来触发广播,以下是一些步骤和示例代码。

1. 创建JNI接口:

首先,在你的Java代码中,创建一个接口来调用广播发送:

public class MyBroadcastSender {
    static {
        System.loadLibrary("myjni"); // 加载JNI库
    }

    public static native void sendBroadcast(Context context);
}

2. 创建JNI库:

接下来,在C语言层创建JNI库来执行广播发送。这需要你对JNI有一定的了解。

3. 在C代码中触发广播:

在你的JNI库中,你可以使用以下代码触发广播:

#include <jni.h>

JNIEXPORT void JNICALL Java_com_example_myapp_MyBroadcastSender_sendBroadcast(JNIEnv *env, jclass cls, jobject context) {
    jclass contextClass = (*env)->GetObjectClass(env, context);
    jmethodID methodId = (*env)->GetMethodID(env, contextClass, "sendBroadcast", "(Landroid/content/Intent;)V");
    
    if (methodId != NULL) {
        jobject intent = (*env)->NewObject(env, (*env)->FindClass(env, "android/content/Intent"), (*env)->GetMethodID(env, (*env)->FindClass(env, "android/content/Intent"), "<init>", "(Ljava/lang/String;)V"), (*env)->NewStringUTF(env, "nova.android.hdmi.plugout"));
        (*env)->CallVoidMethod(env, context, methodId, intent);
        (*env)->DeleteLocalRef(env, intent);
    }
    
    (*env)->DeleteLocalRef(env, contextClass);
}

这个示例涉及到JNI和Java调用的复杂性,需要一些基本的JNI知识。此外,权限方面,通常来说,发送标准的广播(非自定义广播)不需要特殊权限。

注意: 从C语言层直接执行广播是不常见的,更常见的方式是从Java层进行广播的发送。如果你不是非常熟悉JNI和Android系统层的编程,建议你考虑使用Java层进行广播发送。

system/bin下用am发广播可能要检查一下root权限,或者APP是系统级的APP好像也可以

在C语言层使用system命令执行am命令发广播时,确实存在路径问题。system命令默认会在系统的PATH环境变量中寻找可执行文件,而vendor/bin和system/bin在PATH中的位置可能不同。

为了解决这个问题,你可以尝试使用绝对路径来执行am命令,而不依赖于系统的PATH环境变量。你可以在代码中指定am命令的完整路径,例如:

system("/system/bin/am broadcast -a nova.android.hdmi.plugout");

这样就能确保使用正确的am命令路径来发广播了。

另外,关于广播无法被Java层监听到的问题,确保你在Java代码中正确注册了广播接收器,并且指定了正确的广播动作(action)。你可以在AndroidManifest.xml文件中添加一个广播接收器来监听你发送的广播动作,例如:

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="nova.android.hdmi.plugout" />
    </intent-filter>
</receiver>

这样,在MyBroadcastReceiver类中实现广播接收逻辑,就能够接收到你发送的广播了。确保你的广播接收器类和AndroidManifest.xml中的配置正确无误。

android通过命令发送广播实例详解
可以参考下


通过system调用Am命令执行动作_system/bin/am_WythePlus的博客-CSDN博客 在底层代码中看到这样一条语句: system("/system/bin/sh -c \"am broadcast -a android.intent.action.AT_AIRPLANE_MODE --ez state true\"");system 这是干什么的啊?? 经google原来system是系统调用,执行一个系统命令。 _system/bin/am https://blog.csdn.net/G_linuxer_/article/details/51177626

引用gpt作答:
在 C 语言层通过调用 system() 函数执行 am broadcast 命令发送广播时,涉及到跨不同目录的文件执行。跨目录执行可能会受到安全策略的限制,因此您可能无法直接发送广播。以下是几种可能的解决方法:

  1. 使用 Java Native Interface(JNI):您可以在 C 代码中编写与 Java 层交互的代码,并使用 JNI 调用 Java 层的方法来发送广播。这样可以避免直接在 C 语言层发送广播时的权限限制问题。

  2. 将执行程序移动至 system/bin 目录:如果您的需求是将位于 vendor/bin 目录下的可执行程序发送广播,则可以将可执行程序移动到 system/bin 目录下,这样就可以直接通过 am broadcast 命令发送广播了。

  3. 自定义发送广播函数:在 C 代码中,使用 socketpipe 等方法与 Java 层进行通信,自定义一个发送广播的函数,通过与 Java 层的交互,请求 Java 层执行 am broadcast 命令发送广播。

需要注意的是,针对系统目录的操作可能会影响设备的稳定性和安全性,应该谨慎处理,并确保您有足够的权限进行相应的操作。