以下代码在API 23上可以工作,但在API 27上无法工作。我了解到,在Android API 26及以上版本中有一些限制,用于接收广播意图,但这些限制仅适用于清单文件中指定的广播意图:
在清单文件中:
以上两种方法都无法正常工作。
public class USBTest extends Service
{
private USBMountBroadcastReceiver mountBroadcastReceiver;
private class USBMountBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(final Context context, Intent intent)
{
String action = intent.getAction();
if (action == null)
{
Log.i(TAG, " got NULL action");
return;
}
if (action.equals(Intent.ACTION_MEDIA_MOUNTED))
{
String root = intent.getData().getPath();
Log.d(TAG, "USB mount path is" + root);
}
}
}
@Override
public void onCreate()
{
mountBroadcastReceiver = new USBMountBroadcastReceiver();
IntentFilter usbIntent = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
usbIntent.addAction(Intent.ACTION_MEDIA_EJECT);
usbIntent.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
usbIntent.addAction(Intent.ACTION_MEDIA_REMOVED);
usbIntent.addDataScheme("file");
registerReceiver(mountBroadcastReceiver, usbIntent);
}
}
更新1: 没有服务的广播接收器:
public class USBBroadcastReceiver extends BroadcastReceiver
{
private static final String TAG = "USBBroadcastReceiver";
/**
* @see android.content.BroadcastReceiver#onReceive(Context,Intent)
*/
@Override public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action!=null) Log.i(TAG, "got action = " + action);
if (action==null)
{
Log.i(TAG, "got NULL action");
}
else if (Intent.ACTION_MEDIA_MOUNTED.equals(action))
{
Log.i(TAG, "Received media mounted : " + action);
}
}
}
在清单文件中:
<receiver android:name="USBBroadcastReceiver" android:exported="True">
<intent-filter>
<action android:name="android.intent.action.MEDIA_EJECT" />
<action android:name="android.intent.action.MEDIA_REMOVED" />
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.MEDIA_BAD_REMOVAL" />
<data android:scheme="file" />
</intent-filter>
</receiver>
更新2: JobIntent服务:
public class TestUSB extends JobIntentService
{
private static final String TAG = "TestUSB";
/**
* Unique job ID for this service.
*/
static final int JOB_ID = 1001;
@Override
protected void onHandleWork(Intent intent)
{
Log.i(TAG, "onHandleWork");
String action = intent.getAction();
if (action!=null) Log.i(TAG, "got action = " + action);
}
}
在清单文件中:
<service android:name="TestUSB"
android:permission="android.permission.BIND_JOB_SERVICE">
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
</intent-filter>
</service>
以上两种方法都无法正常工作。