Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 广播接收器未接收引导和媒体安装意图_Java_Android_Android Intent_Broadcastreceiver_Intentfilter - Fatal编程技术网

Java 广播接收器未接收引导和媒体安装意图

Java 广播接收器未接收引导和媒体安装意图,java,android,android-intent,broadcastreceiver,intentfilter,Java,Android,Android Intent,Broadcastreceiver,Intentfilter,我正在尝试创建一个简单的广播接收器,它可以接收android.intent.action.BOOT_完成的意图以及android.intent.action.MEDIA_安装的意图。我们的想法是在接收到这些意图中的任何一个时启动服务。因此,该服务应在Android引导完成后启动,或者当USB存储设备连接到Android目标时启动,如果该服务尚未启动。 本节定义了应用程序使用的权限 <uses-permission android:name="android.permission.READ_

我正在尝试创建一个简单的广播接收器,它可以接收android.intent.action.BOOT_完成的意图以及android.intent.action.MEDIA_安装的意图。我们的想法是在接收到这些意图中的任何一个时启动服务。因此,该服务应在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" />
我面临的问题是,没有一个意图到达我的广播接收器IntentReceiver类中的任何日志都没有在logcat中打印,尽管我可以在Android调试日志中看到引导完成和媒体装载的意图正在广播。此外,android系统启动后,此应用程序不会启动


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

请确保您的应用程序中至少有一个活动。从Android 3.1开始,BroadcastReceiver将在用户手动启动活动之前无法工作,这是为了提供安全性。一旦用户第一次运行应用程序,您的BroadcastReceiver将始终运行,除非它不会强制停止。一旦活动在第一时间启动,您的广播接收器将运行,即使在重新启动设备后。

确保您的应用程序中至少存在一个活动。从Android 3.1开始,广播接收器将在用户手动启动活动之前不工作,这是为了提供安全性。一旦用户第一次运行应用程序,您的BroadcastReceiver将始终运行,除非它不会强制停止。一旦活动第一次启动,您的广播接收器将在重启设备后运行。

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

使您的应用程序成为自定义ROM源、内置和闪存设备的一部分。 在设备上获得root访问权限,将apk推到/system/priv app 4.4,然后重新启动,瞧!
好的,所以我把apk推到/system/priv-app,这是放置自定义ROM中的系统应用程序的地方。现在我的应用程序中不需要任何活动,因为它是自定义ROM的一部分,并且被识别为系统应用程序。看起来,如果您的应用程序是第三方应用程序,那么它必须具有能够接收广播意图的活动。 但是在这种情况下,我可以控制自定义ROM源代码以及设备上的根访问。所以这两种方法都有效

使您的应用程序成为自定义ROM源、内置和闪存设备的一部分。 在设备上获得root访问权限,将apk推到/system/priv app 4.4,然后重新启动,瞧!
您的意思是说,我可以在安装应用程序后启动一次虚拟空白活动,此后,即使我在重新启动后不启动/启动活动,应用程序也会继续收到意图,并根据需要启动服务,对吗?您在此应用程序中有任何活动吗?没有,我在此应用程序中没有任何活动。我们的想法是在后台线程中启动服务,该应用程序应该执行类似于手机/平板电脑中Android软件升级方式的系统升级,因此我们并不真正需要一项活动。如果没有一项活动,您将不会收到任何意图。这是肯定的。根据安卓3.1的安全问题,您必须至少有一个活动。你的代码将在Android 3.1以下运行,但不会在Android 3.1及以上版本上运行。如果应用程序是自定义ROM的一部分,那么我相信你可以解决这个问题。我不知道怎么做,因为我从来没有建立过自定义ROM。但在一个正常的设备上,如果这个应用程序没有系统签名,安装时你的应用程序将处于停止状态,它将永远不会得到任何广播意图。您对此无能为力。您的意思是说,我可以在安装应用程序后启动一次虚拟空白活动,此后,即使我在重新启动后不启动/启动活动,应用程序也会继续收到意图,并根据需要启动服务,对吗?你在这个应用程序中有任何活动吗?没有,我在这个应用程序中没有任何活动。我们的想法是在后台线程中启动服务,该应用程序应该执行系统升级,类似于手机/平板电脑中Android软件的升级方式,因此我们并不真正需要一项活动
我没有任何意图。这是肯定的。根据安卓3.1的安全问题,您必须至少有一个活动。你的代码将在Android 3.1以下运行,但不会在Android 3.1及以上版本上运行。如果应用程序是自定义ROM的一部分,那么我相信你可以解决这个问题。我不知道怎么做,因为我从来没有建立过自定义ROM。但在一个正常的设备上,如果这个应用程序没有系统签名,安装时你的应用程序将处于停止状态,它将永远不会得到任何广播意图。你对此无能为力。是的,它让我等了两天,直到我能接受我自己的答案。感谢您提醒@davidwaseryeah,它要求我等待两天,直到我能够接受自己的答案。感谢您提醒@DavidWasser
<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" />
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));
    }