天天看點

适配Android7.0的拍照問題可直接使用!

最近在項目遇到拍照上傳的功能,才知道Android7.0之後直接使用本地真實路徑的Uri會抛出

FileExposedExceptiond

 異常。

才知道7.0之後需要用FileProvider才行。找了網上很多都不能用!

直接上代碼吧

第一步,在AndroidMainfest裡加上

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.administrator.myapplication.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">

    <!--指定Uri的共享路徑-->
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>
           

第二步建立xml檔案夾,并建立provider_paths資源檔案

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_image" path="."/>
</paths>
           

在activity中啟動相機,直接在button裡調用takephone()方法就可以

private static  final int TAKE_PHONE=20;//啟動相機碼
private File outputImage
private Uri imageUri;
           
private void takePhone() {
    //建立一個File對象用于存儲拍照後的照片
     outputImage=new File(getExternalCacheDir(),"one_image.png");
    try{
        if(outputImage.exists()){
            outputImage.delete();
        }
        outputImage.createNewFile();
    }catch (Exception e){
        e.printStackTrace();
    }

    //判斷Android版本是否是Android7.0以上
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
        imageUri= FileProvider.getUriForFile(MainActivity.this,"com.example.administrator.myapplication.fileprovider",outputImage);
//AndroidMainfest中authorities一定要跟第二個參數一樣!
    }else{
        imageUri=Uri.fromFile(outputImage);
    }

    //啟動相機程式
    Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
    intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
    startActivityForResult(intent,TAKE_PHONE);
}
           
在onActivityResult
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode){
        case TAKE_PHONE:
            //相機拍照回調
            if(resultCode==RESULT_OK){

                Log.i("okokok",imageUri.getPath());//可以列印出路徑,轉為Bitmap顯示

            }

    }


}
           

如果要上傳到伺服器的話,拍照完直接拿outputImage上傳就可以,雖然是1.5m的檔案沒壓縮。

如果有說的不好的麻煩各位大佬指出來謝謝!!

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載https://blog.csdn.net/weixin_37758967/article/details/82909669