gpt4 book ai didi

java - 广播接收器未收到 BOOT 和 MEDIA_MOUNTED Intent

转载 作者:行者123 更新时间:2023-11-29 03:13:17 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的 BroadcastReceiver,它可以接收 android.intent.action.BOOT_COMPLETED Intent 以及 android.intent.action.MEDIA_MOUNTED Intent 。这个想法是在收到这些 Intent 中的任何一个时启动服务。因此,该服务应在 Android 启动完成后或 USB 存储设备连接到 Android 目标时启动(如果此时该服务尚未启动)。应用程序使用的权限在本节中定义

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

以下部分定义了 BroadcastReceiver 负责处理 Intent 并启动相应的服务。

<receiver
android:name="com.example.systemupgradeapplication.IntentReceiver"
android:label="USB Detection Receiver"
android:enabled="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
<intent-filter android:priority="999" >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

应从广播接收器启动的相应服务在以下部分定义

<service android:name=".SysUpgradeService" />

注意:接收器和服务组件在 <application> 中定义Android list 的一部分。

以下 fragment 是负责处理广播的 Intent 的类

public class IntentReceiver extends BroadcastReceiver {
private final static String TAG = "IntentReceiver";
private static boolean m_UsbInserted = false;
private static boolean m_UsbRemoved = true;
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "LaunchReceiver::ACTION_MEDIA_MOUNTED :: intent received with path= ");
// TODO Auto-generated method stub
//if(intent.)
String action = intent.getAction();
if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
String path = intent.getDataString();
if(path.contains("usb")) {
m_UsbInserted = true;
Log.d(TAG, "LaunchReceiver::ACTION_MEDIA_MOUNTED :: intent received with path= "+path);
Intent myIntent = new Intent(context, SysUpgradeService.class);
myIntent.putExtra("path", path);
context.startService(myIntent);
}

}else if(action.equals(Intent.ACTION_BOOT_COMPLETED)) {
Log.d(TAG, "BOOT Completed intent received");
context.startService(new Intent(context, SysUpgradeService.class));
}

我面临的问题是,没有任何 Intent 到达我的广播接收器(IntentReceiver 类中的日志都没有在 logcat 中打印),即使我可以在 Android 调试日志中看到 BOOT_COMPLETE 和 MEDIA_MOUNTED正在广播 Intent 。此外,此应用程序在 android 系统启动后未启动。

非常感谢您在这方面的帮助,我的方法可能有什么问题以及一些可能的解决方案。

最佳答案

好的,所以我将 apk 推送到/system/priv-app,这是放置作为自定义 ROM 一部分的系统应用程序的地方。现在我不需要在我的应用程序中进行任何 Activity ,因为它是自定义 ROM 的一部分并且被识别为系统应用程序。似乎如果您的应用程序是第 3 方应用程序,它必须有一个 Activity 才能接收广播的 Intent 。但是在这种情况下,我可以控制自定义 ROM 源代码以及设备上的根访问权限。所以这两种方法都有效

  1. 使您的应用程序成为自定义 ROM 源代码的一部分,在设备上构建和闪存。
  2. 在设备上获取 root 访问权限,将您的 apk 推送到/system/priv-app(4.4 及更高版本),重新启动,瞧!

关于java - 广播接收器未收到 BOOT 和 MEDIA_MOUNTED Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28064042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com