前段时间客户提出了一个小需求。需要实现开机后插入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包括了 MOUNTEDUNMOUNT等状态,我们可以在 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);
    }

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐