android 6.0开机后自动播放U盘视频
前段时间客户提出了一个小需求。需要实现开机后插入U盘,自动播放U盘里面的视频。为了完成这个需求,是这样处理的,APP开机启动,创建服务,监听U盘的插入。我们有两个问题需要处理,第一是APP需要开机启动;第二是需要在监听U盘的插入。实现APP开机启动我们可以通过监听开机广播启动APP来实现开机启动。具体实现如下:1、在AndroidManifest.xml中添加广播接收</applicatio
·
前段时间客户提出了一个小需求。需要实现开机后插入U盘,自动播放U盘里面的视频。为了完成这个需求,是这样处理的,APP开机启动,创建服务,监听U盘的插入。我们有两个问题需要处理,第一是APP需要开机启动;第二是需要在监听U盘的插入。
实现APP开机启动
我们可以通过监听开机广播启动APP来实现开机启动。具体实现如下:
1、在AndroidManifest.xml中添加广播接收
</application>
..............
<receiver
android:name=".Myreceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
2、创建Myreceiver.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Environment;
import android.util.Log;
public class Myreceiver extends BroadcastReceiver {
private String TAG = "VideoPlayer";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive: receive boardcast. Start service");
Intent startServiceIntent = new Intent(context,MyService.class);
context.startService(startServiceIntent);
}
}
实现U盘插入并获取路径
U盘插入的检测,找了很多资料在实现的过程中都遇到了一些问题。最后,还是找到了一条实现的方法:
监听U盘的插入广播,在检测到U盘挂载上之后,通过反射调用VolumInfo的方法获取U盘路径。终归是经验不足,能力有待提升导致的过程比较坎坷。下面慢慢的介绍一下。
1、U盘插入的广播
安卓6.0和之前的版本不一样,在插入U盘的时候发出广播:android.hardware.usb.action.
USB_DEVICE_ATTACHE
android.os.storages.action.
VOLUME_STATE_CHANGED
不会发出
MEDIA_MOUNT广播,也不会在广播里带路径。这里还有一点需要注意的是,
USB_DEVICE_ATTACHE发出后但是U盘并没有挂载上,需要几秒之后发出
VOLUME_STATE_CHANGED,广播里带来状态值,当状态值为
MOUNTED的时候U盘才挂载上,我们才能去获取U盘的路径。
STATE_CHANGED广播的state包括了
MOUNTED和
UNMOUNT等状态,我们可以在
VolmueInfo.clas
s中看到对应的值。
VolmueInfo.clas
s这个默认是不可见的,需要通过反射来调用它的方法。
2、获取U盘路径
public static String getUdiskPath(Context mContext){
String pathString = null;
StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
try {
Class storeManagerClazz = Class.forName("android.os.storage.StorageManager"); // 反射查找类
Method getVolumesMethod = storeManagerClazz.getMethod("getVolumes"); // 反射查找方法
List<?> volumeInfos = (List<?>)getVolumesMethod.invoke(mStorageManager); // 调用方法
Class volumeInfoClazz = Class.forName("android.os.storage.VolumeInfo"); // 反射查找类
Method getFsUuidMethod = volumeInfoClazz.getMethod("getFsUuid"); // 反射查找方法
Field pathField = volumeInfoClazz.getDeclaredField("path"); // 查找变量
if(volumeInfos != null) {
for (Object volumeInfo : volumeInfos) {
String uuid = (String) getFsUuidMethod.invoke(volumeInfo); // 调用方法
if (uuid != null) {
Log.e(TAG, "getUdiskPath: " + uuid.toString());
pathString = (String) pathField.get(volumeInfo);//U盘路径
}
}
}
}catch (Exception e){
e.printStackTrace();
}
return pathString;
}
3、播放视屏
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.os.storage.action.VOLUME_STATE_CHANGED");
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int i = intent.getIntExtra("android.os.storage.extra.VOLUME_STATE",0);
if (i != 2){
Log.e(TAG, "onReceive: state is " + i);
return;
}
// 获取u盘路径
String path = getUdiskPath(mContext);
Log.e(TAG, "onCreate: U盘路径是:" + path);
Uri videoUri = Uri.parse(path + "/test.mp4");
// 启动视屏播放
Intent startVideoIntent = new Intent(Intent.ACTION_VIEW, videoUri);
startVideoIntent.setDataAndType(videoUri, "video/mp4");
startVideoIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startVideoIntent);
}
}, intentFilter);
}
更多推荐
已为社区贡献2条内容
所有评论(0)