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

时间:2015-01-21 09:49:35

标签: java android android-intent broadcastreceiver intentfilter

我试图创建一个简单的BroadcastReceiver,它可以接收android.intent.action.BOOT_COMPLETED意图以及android.intent.action.MEDIA_MOUNTED意图。我们的想法是在接收这些意图中的任何一个时启动服务。因此,应该在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));
    }

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

我感谢你在这方面的帮助,我的方法和一些可能的解决方案可能出错。

2 个答案:

答案 0 :(得分:3)

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

  1. 使您的应用程序成为自定义ROM源的一部分,在设备上构建和闪存。
  2. 在设备上获取root权限,将你的apk推送到/ system / priv-app(4.4以后),重启并瞧!

答案 1 :(得分:1)

确保您已经在应用程序中存在一项活动。从Android 3.1开始,在用户手动启动活动之前,BroadcastReceiver将无法工作,这是为了提供安全性。一旦用户第一次运行应用程序,那么您的BroadcastReceiver将始终运行,除非它没有强制停止它。一旦首次启动活动,您的广播接收器即使在重启后也会运行。