… outputImage.createNewFile();//如果創建文件失敗,則拋出異常 … //getExternalCacheDir()是當前應用緩存數據(應用關聯緩存目錄)的位置,這樣寫的好處是因為從Android6.0開始,讀寫SD卡被列為危險項目,處理起來比較復雜,而采用應用關聯緩存目錄可以繞過這一步。
① 進入AndroidManifest.xml中,如下改動
<application … <provider android:authorities="com.wcs.choosepictest.fileprovider" android:name="android.support.v4.content.FileProvider"http://這里是固定的寫法 android:exported="false"http://這里必須為false,為true則會報安全異常 android:grantUr② 新建xml目錄,并將內容設為:<?xml version="1.0" encoding="utf-8"?><path xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path=""/></path>附源代碼: MainActivity:
package com.wcs.choosepictest;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Build;import android.os.Environment;import android.provider.MediaStore;import android.support.v4.content.FileProvider;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;public class MainActivity extends AppCompatActivity { public static final int TAKE_PHOTO = 1;//照相 private Button takePhoto; private ImageView picture; private Uri imageUri;//圖片的保存地址 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); takePhoto = (Button)findViewById(R.id.take_photo); picture = (ImageView)findViewById(R.id.picture); takePhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("MainActivity","Starting..."); //創建File對象,用于儲存招片 File outputImage = new File(getExternalCacheDir(),"output_image.jpg"); try{ if(outputImage.exists()) outputImage.delete(); outputImage.createNewFile();//如果創建文件失敗,則拋出異常 }catch (IOException e){ e.printStackTrace(); } if(Build.VERSION.SDK_INT >= 24){ imageUri = FileProvider.getUriForFile(MainActivity.this,"com.wcs.choosepictest.fileprovider",outputImage); }else { imageUri = Uri.fromFile(outputImage);//將圖片地址用URI保存 } Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); startActivityForResult(intent,TAKE_PHOTO);//啟動相機 } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode,resultCode,data); switch(requestCode){ case TAKE_PHOTO: Log.d("MainActivity","resultCode is:"+resultCode); if(resultCode == RESULT_OK){ try{ Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); picture.setImageBitmap(bitmap); }catch (FileNotFoundException e){ e.printStackTrace(); } } break; default: break; } }}AndroidManifest:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wcs.choosepictest"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Afile_paths:<?xml version="1.0" encoding="utf-8"?><path xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="my_images" path=""/></path>運行效果如下:
新聞熱點
疑難解答