Android 7.0啟動(dòng)相機(jī)拍照適配

原文地址 : ??相機(jī)啟動(dòng)適配 ??感謝大神的代碼,非常好用!

1.現(xiàn)象

在項(xiàng)目中調(diào)用相機(jī)拍照和錄像的時(shí)候,android4.x,Android5.x,Android6.x均沒有問題,在Android7.x下面直接閃退

2.原因分析

android升級(jí)到7.0后對(duì)權(quán)限又做了一個(gè)更新即不允許出現(xiàn)以file://的形式調(diào)用隱式APP,需要用共享文件的形式:content:// URI

3.解決方案

下面是打開系統(tǒng)相機(jī)的方法,做了android各個(gè)版本的兼容:



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:相機(jī)工具類

*?調(diào)用相機(jī)拍照

*?調(diào)用相機(jī)錄像并保存到目錄

*?Created?by?xuzhuyun?on?2017/3/2.

*/

publicclassCameraUtil?{

publicstaticFile?tempFile;

publicstaticfinalintPHOTO_REQUEST_CAREMA?=1;//?拍照

publicstaticfinalintCAPTURE_VIDEO_ACTIVITY_REQUEST_CODE?=2;//?拍攝視頻

/**

*?打開相機(jī)拍照

*

*?@param?activity

*/

publicstaticvoidopenCamera(Activity?activity)?{

//獲取系統(tǒng)版本

intcurrentapiVersion?=?android.os.Build.VERSION.SDK_INT;

//?激活相機(jī)

Intent?intent?=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

//?判斷存儲(chǔ)卡是否可以用,可用進(jìn)行存儲(chǔ)

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)?{

//?從文件中創(chuàng)建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);

}

}

//?開啟一個(gè)帶有返回值的Activity,請(qǐng)求碼為PHOTO_REQUEST_CAREMA

activity.startActivityForResult(intent,?PHOTO_REQUEST_CAREMA);

}

/**

*?打開相機(jī)錄像

*/

publicstaticvoidstartToVideo(Activity?activity)?{

//獲取系統(tǒng)版本

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);

}

/**

*?創(chuàng)建保存錄制得到的視頻文件

*

*?@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;

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 只簡(jiǎn)述我發(fā)現(xiàn)問題的根源,有些是適配了7.0,會(huì)報(bào)權(quán)限失敗問題,那是由于沒有動(dòng)態(tài)授權(quán)導(dǎo)致,接下來我一步一步給大家實(shí)現(xiàn)...
    Wocus閱讀 2,451評(píng)論 4 5
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個(gè)即將畢業(yè)的Android程序媛,開始面臨找工作了,...
    左神話閱讀 5,154評(píng)論 7 59
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 7,319評(píng)論 0 17
  • 想到視頻錄制,肯定又是運(yùn)用MediaRecorder,這個(gè)類實(shí)在是方便,但是好用的東西一定要慎重,畢竟沒有那么便宜...
    2c2z0閱讀 2,170評(píng)論 0 2
  • 第五篇,現(xiàn)在已經(jīng)是六點(diǎn)五十了,昨天奶孩子時(shí)我竟然跟著睡著了,漏掉了一篇小感悟,今天早上小小彌補(bǔ)一下吧,因?yàn)槿税杀容^...
    安安木棉閱讀 231評(píng)論 1 1

友情鏈接更多精彩內(nèi)容