先創建圖片文件,再根據不同的安卓版本采用不同的方法把圖片文件封裝成Uri,然後用Intent啟動相機程序,最後利用回調處理拍出來的相片,代碼如下:
import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import java.io.File; public class MainActivity extends AppCompatActivity { public static final int TAKE_PHOTO = 1; private Uri imageUri; private ImageView piture; @Override protected void onCreate(Bundle saveInstance) { setContentView(R.layout.activity_main); super.onCreate(saveInstance); File outputImage=new File(getExternalCacheDir(),"output_image.jpg"); //getExternalCacheDir()得到專門用於存放存放當前應用緩存數據的位置,具體路徑為:/sdcard/Android/data//cache try{ if(outputImage.exists()){ outputImage.delete(); }else{ outputImage.createNewFile(); } }catch (Exception e){ e.printStackTrace(); } if(Build.VERSION.SDK_INT>=24){ //低於7.0用Uri.fromFile()將文件轉換為Uri imageUri= FileProvider.getUriForFile(MainActivity.this,"StringAuthority",outputImage); // }else{ imageUri=Uri.fromFile(outputImage); } //啟動相機 Intent intent=new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); //第一個是data的名字,第二個是data startActivityForResult(intent,1); //被開始的activity結束後返回一個requestCode=TAKE_PHOTO給覆蓋方法onActivityResult } @Override protected void onActivityResult(int requestCode,int resultCode,Intent data){ 回到該activity後會調用的方法 piture=(ImageView)findViewById(R.id.piture); switch(requestCode){ case TAKE_PHOTO: //該resultCode在調用的activity中用setResult(resultCode,intent)設置 if(resultCode==RESULT_OK){ try{ Bitmap bitMap= BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); //通過外部內容接收器讀入圖片Uri piture.setImageBitmap(bitMap); }catch(Exception e){ e.printStackTrace(); } } } } }