打開本地視頻選擇器
private void openLocalVideo(){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setDataAndType(android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI,"video/*");
getActivity().startActivityForResult(intent,IntentCode.REQUEST_VIDEO_CAPTURE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("YM","本地視頻獲取的數據:requestCode->"+requestCode+"-->resultCode:"+resultCode);
if (requestCode == IntentCode.REQUEST_VIDEO_CAPTURE){
Uri videoUri = data.getData();
}
}
注意:
1、該代碼在華爲10.0上面打開後頁面會包含圖片和視頻
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
getActivity().startActivityForResult(intent,IntentCode.REQUEST_VIDEO_CAPTURE);
2、關於打開本地視頻的其餘注意事項,參考以下鏈接:
Android 跳轉系統選擇本地視頻的功能:https://www.cnblogs.com/widgetbox/p/7503894.html
讀取本地視頻預覽圖
由於Android10.0的存儲方式進行了改變,大體上分爲私有存儲和共享文件。當我們使用Cursor來進行查詢本地視頻資源的時候只能查詢到共享文件中的視頻,同時也可以查詢到該視頻的預覽圖,但是上述打開本地視頻選擇器的功能卻可以顯示私有存儲裏面的文件,所以用上述打開本地視頻選擇器返回的Uri通過cursor去查詢本地視頻時候是查不到的,所以預覽圖也是沒有的。針對此種問題需要通過以下方式來獲取視頻並生成預覽圖操作:
MediaExtraBean.java//這裏面爲了行文方便沒有編寫set和get方法,所以下文中進行測試時候需要注意
public class MediaExtraBean {
public Uri thumbPath;//縮略圖路徑
public String localPath = "";//路徑
public String title = "";//視頻名稱
public int duration;//視頻時長
public long size;//視頻大小
public String imagePath;//視頻縮略圖路徑
}
public class MediaUtils {
public MediaExtraBean getRingDuring(Uri mUri){
Log.e("YM","文件路徑:"+mUri);
String duration=null;
MediaExtraBean mediaExtraBean = new MediaExtraBean();
android.media.MediaMetadataRetriever mmr = new android.media.MediaMetadataRetriever();
try {
ParcelFileDescriptor parcelFileDescriptor =
ImProvider.context.getContentResolver().openFileDescriptor(mUri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
HashMap<String, String> headers=null;
headers = new HashMap<String, String>();
headers.put("User-Agent", "Mozilla/5.0 (Linux; U; Android 4.4.2; zh-CN; MW-KW-001 Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/1.0.0.001 U4/0.8.0 Mobile Safari/533.1");
// mmr.setDataSource(mUri, headers);
mmr.setDataSource(fileDescriptor);
duration = mmr.extractMetadata(android.media.MediaMetadataRetriever.METADATA_KEY_DURATION);
mediaExtraBean.setDuration(Integer.parseInt(duration));
Log.e("YM","時長:"+duration);
Bitmap bitmap = mmr.getFrameAtTime();//獲取第一幀,然後保存到本地
// Load thumbnail of a specific media item.
// Bitmap thumbnail =
// ImProvider.context.getApplicationContext().getContentResolver().loadThumbnail(
// mUri, new Size(640, 480), null);
Uri uri = createImageFile();
ImProvider.context.grantUriPermission(ImProvider.context.getPackageName(), uri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
ParcelFileDescriptor imageFd = ImProvider.context.getContentResolver().openFileDescriptor(uri, "w");
FileDescriptor thumb = imageFd.getFileDescriptor();
FileOutputStream fileOutputStream = new FileOutputStream(thumb);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
mediaExtraBean.setThumbPath(uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
mmr.release();
}
return mediaExtraBean;
}
private Uri createImageFile(){
Uri uri;
String timeStamp =
new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = String.format("JPEG_%s.png", timeStamp);
String status = Environment.getExternalStorageState();
// 判斷是否有SD卡,優先使用SD卡存儲,當沒有SD卡時使用手機存儲
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME,imageFileName);
if (status.equals(Environment.MEDIA_MOUNTED)) {
uri = ImProvider.context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
} else {
uri = ImProvider.context.getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, contentValues);
}
Log.e("YM","文件路徑:"+uri.toString());
return uri;
}
}