Android 7.0啟動相機拍照適配

原文地址 : ??相機啟動適配 ??感謝大神的代碼,非常好用!

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;

}

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 只簡述我發現問題的根源,有些是適配了7.0,會報權限失敗問題,那是由于沒有動態授權導致,接下來我一步一步給大家實現...
    Wocus閱讀 2,395評論 4 5
  • 哎呀呀 ,馬上就要面臨找工作了,媛媛心里緊張呀. 作為一個即將畢業的Android程序媛,開始面臨找工作了,...
    左神話閱讀 4,861評論 7 59
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,523評論 0 17
  • 想到視頻錄制,肯定又是運用MediaRecorder,這個類實在是方便,但是好用的東西一定要慎重,畢竟沒有那么便宜...
    2c2z0閱讀 2,132評論 0 2
  • 第五篇,現在已經是六點五十了,昨天奶孩子時我竟然跟著睡著了,漏掉了一篇小感悟,今天早上小小彌補一下吧,因為人吧比較...
    安安木棉閱讀 187評論 1 1