本文大部分來自第二行代碼,只是部分權限問題改動與說明
其中主要問題就是安卓6.0權限問題和7.0url問題。
首先需要設置權限
<!-- 攝像頭 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 獲取sd卡寫的權限,用於文件上傳和下載 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
這是使用照相機和可以修改內存的權限2.然後是關於file的uri
安卓7.0要求,禁止暴露file的uri,否則會報錯FileUriExposeException錯誤,必須使用fileProvider把uri封裝再傳給外部。配置如下
① 設置在<manifest>
裏設置
<application
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.mbmob.fileprovider"
<!--此處的authorities可以設置任意值,但是不同應用間必須不同,否則會因爲數據庫重複無法安裝 -->
android:exported="false"
<!--必須爲false ,意思是不可被分享,這是fileprovide要求-->
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
<!--meta指定uri的共享路徑,並且引用了一個叫@xml/file_paths資源-->
</provider>
</application>
②接下來在右擊res,new————directory,創建xml目錄,然後生成file_paths,內容複製如下
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name ="my_images" path=""/>
<!--name名字任意,paths爲空說明整個sd卡可共享(可能紅色報錯,不用管)-->
</paths>
3拍照的相關代碼
首先檢測權限,照相的權限和訪問內存卡的權限
if((ContextCompat.checkSelfPermission(getActivity().getBaseContex(),Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED)||ContextCompat.checkSelfPermission(getActivity().getBaseContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) !=PackageManager.PERMISSION_GRANTED)) {
//如果沒有授權,則請求授權
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1311);
//String數組中爲申請的權限,第一個是相機,第二個爲修改內存,最後的參數即爲申請授權的返回值,我設置的1311
、、
} else {
zhaoxiang();
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 1311:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED&& grantResults[1] == PackageManager.PERMISSION_GRANTED) {
zhaoxiang();
} else {
Toast.makeText(getContext(),"沒有權限打開相機",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}`
public void zhaoxiang() {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH); headImage = new File(Environment.getExternalStorageDirectory() + "/mbmob/", year + "-" + month + "-" + day + i.getName() + "head.jpg");
//創建一個file,第一個指數路徑,第二個爲圖片名字 其中,路徑爲sd卡中一個名爲mbmob的文件下,headImage是我提前聲明的一個空file
//如果不加/mbob/這句,就是獲得手機裏一個專門放置應用緩存的地方 get那個方法就是獲取這個位置
try {
if (headImage.exists()) {
headImage.delete();
}
headImage.createNewFile();
//如果原來就有這個文件 刪除
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {
//判斷安卓版本 高於7.0
imageUri = FileProvider.getUriForFile(getActivity(), "com.example.mbmob.fileprovider", headImage);
// 第一個是content ,第二個即爲在provider裏是設置的author那個,第三個是File對象
} else {
//低於7.0
imageUri = Uri.fromFile(headImage);
//獲取圖片路徑
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
//指定圖片的輸出地址
startActivityForResult(intent, TAKE_PHOTO);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case TAKE_PHOTO:
//照相結束後就會返回,此時調用這個
if (resultCode == RESULT_OK) {
此時獲得的headimage就是保存了圖片的,這裏如何利用自己定義
}
break;
default:
break;
}
}
“`