編輯:Android編程入門
很多應用程序都可能會使用到調用攝像頭拍照和從相冊選取圖片的功能,今天我們開始android中攝像頭與相冊調用的學習。
目錄導航
大致流程:調用相機拍照,然後剪輯,之後再在imageView中顯示。項目結構如下:
一、 一些初始化的代碼:
public static final int TAKE_PHOTO = 1; public static final int CROP_PHOTO = 2; public static final int CHOOSE_PHOTO = 3; private ImageView picture; private Uri imageUri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); picture = (ImageView) findViewById(R.id.picture); }
二、 創建文件:
// 創建File對象,用於存儲拍照後的圖片 private File createImageFile(String fileName) { File outputImage = new File(Environment.getExternalStorageDirectory(), fileName); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); } catch (IOException e) { e.printStackTrace(); } return outputImage; }
三、 調用系統相機拍照,
// 調用系統相機拍照,並創建一張jpg文件 public void takePhone(View view) { imageUri = Uri.fromFile(createImageFile("takephone.jpg")); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, TAKE_PHOTO); // 啟動相機程序 }
四、 onActivityResult方法:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case TAKE_PHOTO: phoneTake(resultCode); break; case CROP_PHOTO: phoneCrop(resultCode); break; case CHOOSE_PHOTO: phoneChoose(resultCode, data); break; default: break; } }
五、 phoneTake方法:
// 拍照的回調 private void phoneTake(int resultCode) { if (resultCode == RESULT_OK) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(imageUri, "image/*"); intent.putExtra("scale", true); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, CROP_PHOTO); // 啟動裁剪程序 } }
六、 phoneCrop方法,裁剪的回調
// 裁剪的回調 private void phoneCrop(int resultCode) { if (resultCode == RESULT_OK) { try { BufferedInputStream inputStream = new BufferedInputStream(getContentResolver().openInputStream(imageUri)); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); picture.setImageBitmap(bitmap); // 將裁剪後的照片顯示出來 } catch (FileNotFoundException e) { e.printStackTrace(); } } }
七、 聲明權限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
一、 從相冊中選擇照片:
// 從相冊中選擇照片: public void choosePhone(View view) { imageUri = Uri.fromFile(createImageFile("choosephone.jpg")); Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop", true); intent.putExtra("scale", true); startActivityForResult(intent, CHOOSE_PHOTO); }
二、 從相冊中選取圖片,再顯示
// 從相冊中選取圖片,再顯示 private void phoneChoose(int resultCode, Intent data) { if (resultCode == RESULT_OK) { ContentResolver resolver = getContentResolver(); Uri originalUri = data.getData(); try { Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, originalUri); if (photo != null) { picture.setImageBitmap(photo); } } catch (IOException e) { e.printStackTrace(); } } }
此前編譯過Android4.4的源碼,但是現在Android都到了7.0的版本,不禁讓我感歎Google的步伐真心難跟上,趁這周周末時間比較充裕,於是在過去的24小時裡,
當啟動Android Studio時,如果彈出adb not responding. you can wait more,or kill adb.exe pro
1、基礎知識(1) 所有Touch事件都被封裝成了MotionEvent對象,包括Touch的位置、時間、歷史記錄以及第幾個手指(多指觸摸)等。 (2) 事件類
PS:最近很多事情都拖拖拉拉的..都什麼辦事效率啊!!! 還得吐槽一下移動運營商,驗證碼超過五次的時候,直接把我的手機號封閉.真是受夠了. 學習筆記:1.And