繁体   English   中英

广播接收器未收到BOOT和MEDIA_MOUNTED意图

[英]Broadcast Receiver not receiving BOOT and MEDIA_MOUNTED intent

我正在尝试创建一个可以接收android.intent.action.BOOT_COMPLETED意图以及android.intent.action.MEDIA_MOUNTED意图的简单BroadcastReceiver。 想法是在接收到这些意图中的任何一个时启动服务。 因此,应在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,负责处理这些意图并启动相应的服务。

<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" />

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

以下代码段是负责处理所广播的意图的类

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));
    }

我面临的问题是,即使我在Android Debug日志中看到BOOT_COMPLETE和MEDIA_MOUNTED意图正在被使用,也没有一个意图到达我的广播接收器(IntentReceiver类中的所有日志都没有在logcat中打印)。广播。 另外,Android系统启动后,此应用程序无法启动。

感谢您在这方面的帮助,我的方法和某些可能的解决方案可能出了问题。

好的,所以我将apk推送到/ system / priv-app,这是放置自定义ROM的系统应用程序的位置。 现在,我的应用程序不需要任何活动,因为它是自定义ROM的一部分,并且被认为是系统应用程序。 看来,如果您的应用程序是第三方应用程序,则它必须具有活动才能接收广播的意图。 但是,在这种情况下,我可以控制自定义ROM源代码以及设备上的root访问。 所以这两种方法都有效

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

确保您的应用程序中存在一项活动。从Android 3.1开始,BroadcastReceiver在用户手动启动一项活动之前将无法工作,这是为了提供安全性。 用户首次运行该应用程序后,您的BroadcastReceiver将始终运行,除非它不强制停止运行。 首次启动活动后,即使重新启动设备,广播接收机仍将运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM