Java 广播接收器未接收引导和媒体安装意图
我正在尝试创建一个简单的广播接收器,它可以接收android.intent.action.BOOT_完成的意图以及android.intent.action.MEDIA_安装的意图。我们的想法是在接收到这些意图中的任何一个时启动服务。因此,该服务应在Android引导完成后启动,或者当USB存储设备连接到Android目标时启动,如果该服务尚未启动。 本节定义了应用程序使用的权限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_
<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));
}