原文地址 : ??相機啟動適配 ??感謝大神的代碼,非常好用!
1.現象
在項目中調用相機拍照和錄像的時候,android4.x,Android5.x,Android6.x均沒有問題,在Android7.x下面直接閃退
2.原因分析
android升級到7.0后對權限又做了一個更新即不允許出現以file://的形式調用隱式APP,需要用共享文件的形式:content:// URI
3.解決方案
下面是打開系統相機的方法,做了android各個版本的兼容:
importandroid.app.Activity;
importandroid.content.ContentValues;
importandroid.content.Intent;
importandroid.net.Uri;
importandroid.os.Environment;
importandroid.provider.MediaStore;
importcom.qhcloud.filetransfer.TransferApp;
importjava.io.File;
importjava.io.IOException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
/**
*?Function:相機工具類
*?調用相機拍照
*?調用相機錄像并保存到目錄
*?Created?by?xuzhuyun?on?2017/3/2.
*/
publicclassCameraUtil?{
publicstaticFile?tempFile;
publicstaticfinalintPHOTO_REQUEST_CAREMA?=1;//?拍照
publicstaticfinalintCAPTURE_VIDEO_ACTIVITY_REQUEST_CODE?=2;//?拍攝視頻
/**
*?打開相機拍照
*
*?@param?activity
*/
publicstaticvoidopenCamera(Activity?activity)?{
//獲取系統版本
intcurrentapiVersion?=?android.os.Build.VERSION.SDK_INT;
//?激活相機
Intent?intent?=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
//?判斷存儲卡是否可以用,可用進行存儲
if(hasSdcard())?{
SimpleDateFormat?timeStampFormat?=newSimpleDateFormat(
"yyyy_MM_dd_HH_mm_ss");
String?filename?=?timeStampFormat.format(newDate());
tempFile?=newFile(Environment.getExternalStorageDirectory(),
filename?+".jpg");
if(currentapiVersion?<24)?{
//?從文件中創建uri
Uri?uri?=?Uri.fromFile(tempFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT,?uri);
}else{
//兼容android7.0?使用共享文件的形式
ContentValues?contentValues?=newContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA,?tempFile.getAbsolutePath());
Uri?uri?=?TransferApp.getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,?contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT,?uri);
}
}
//?開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_CAREMA
activity.startActivityForResult(intent,?PHOTO_REQUEST_CAREMA);
}
/**
*?打開相機錄像
*/
publicstaticvoidstartToVideo(Activity?activity)?{
//獲取系統版本
intcurrentapiVersion?=?android.os.Build.VERSION.SDK_INT;
Uri?fileUri?=null;
File?file?=null;
Intent?intent?=newIntent(MediaStore.ACTION_VIDEO_CAPTURE);
try{
file?=?createMediaFile();
if(file.exists())?{
fileUri?=?Uri.fromFile(file);//?create?a?file?to?save?the?video
}
}catch(IOException?e)?{
e.printStackTrace();
}
if(currentapiVersion?<24)?{
intent.putExtra(MediaStore.EXTRA_OUTPUT,?fileUri);//?set?the?image?file?name
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);//?set?the?video?image?quality?to?high
}else{
//兼容android7.0
ContentValues?contentValues?=newContentValues(1);
contentValues.put(MediaStore.Images.Media.DATA,?file.getAbsolutePath());
Uri?uri?=?activity.getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,?contentValues);
intent.putExtra(MediaStore.EXTRA_OUTPUT,?uri);
}
//?start?the?Video?Capture?Intent
activity.startActivityForResult(intent,?CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
/*
*?判斷sdcard是否被掛載
*/
publicstaticbooleanhasSdcard()?{
returnEnvironment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
/**
*?創建保存錄制得到的視頻文件
*
*?@return
*?@throws?IOException
*/
publicstaticFile?createMediaFile()throwsIOException?{
if(hasSdcard())?{
File?mediaStorageDir?=newFile(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_MOVIES),"CameraVideos");
if(!mediaStorageDir.exists())?{
if(!mediaStorageDir.mkdirs())?{
returnnull;
}
}
//?Create?an?image?file?name
String?timeStamp?=newSimpleDateFormat("yyyyMMdd_HHmmss").format(newDate());
String?imageFileName?="VID_"+?timeStamp;
String?suffix?=".mp4";
File?mediaFile?=newFile(mediaStorageDir?+?File.separator?+?imageFileName?+?suffix);
returnmediaFile;
}
returnnull;
}
}