android調取系統相簿和照相機選取圖片
阿新 • • 發佈:2019-01-30
import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class SelectPhotoActivity extends Activity implements OnClickListener { /** 使用照相機拍照獲取圖片 */ public static final int SELECT_PIC_BY_TACK_PHOTO = 1; /** 使用相簿中的圖片 */ public static final int SELECT_PIC_BY_PICK_PHOTO = 2; /** 開啟相機 */ private Button btn_take_photo; /** 開啟圖冊 */ private Button btn_pick_photo; /** 取消 */ private Button btn_cancel; /** 獲取到的圖片路徑 */ private String picPath; private Intent lastIntent; private Uri photoUri; /** 從Intent獲取圖片路徑的KEY */ public static final String KEY_PHOTO_PATH = "photo_path"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_photo); btn_take_photo = (Button) findViewById(R.id.btn_take_photo); btn_pick_photo = (Button) findViewById(R.id.btn_pick_photo); btn_cancel = (Button) findViewById(R.id.btn_cancel); lastIntent = getIntent(); btn_take_photo.setOnClickListener(this); btn_pick_photo.setOnClickListener(this); btn_cancel.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_take_photo : // 開啟相機 takePhoto(); break; case R.id.btn_pick_photo : // 開啟圖冊 pickPhoto(); break; case R.id.btn_cancel : // 取消操作 this.finish(); break; default : break; } } private void takePhoto() { // 執行拍照前,應該先判斷SD卡是否存在 String SDState = Environment.getExternalStorageState(); if (SDState.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// "android.media.action.IMAGE_CAPTURE" /*** * 需要說明一下,以下操作使用照相機拍照,拍照後的圖片會存放在相簿中的 這裡使用的這種方式有一個好處就是獲取的圖片是拍照後的原圖 * 如果不實用ContentValues存放照片路徑的話,拍照後獲取的圖片為縮圖不清晰 */ ContentValues values = new ContentValues(); photoUri = this.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO); } else { Toast.makeText(getApplicationContext(), "記憶體卡不存在", Toast.LENGTH_SHORT).show(); } } /*** * 從相簿中取圖片 */ private void pickPhoto() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(intent, SELECT_PIC_BY_PICK_PHOTO); } @Override public boolean onTouchEvent(MotionEvent event) { finish(); return super.onTouchEvent(event); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { doPhoto(requestCode, data); } super.onActivityResult(requestCode, resultCode, data); } /** * 選擇圖片後,獲取圖片的路徑 */ private void doPhoto(int requestCode, Intent data) { if (requestCode == SELECT_PIC_BY_PICK_PHOTO) {// 從相簿取圖片,有些手機有異常情況,請注意 if (data == null) { Toast.makeText(getApplicationContext(), "選擇圖片檔案出錯", Toast.LENGTH_SHORT).show(); return; } photoUri = data.getData(); if (photoUri == null) { Toast.makeText(getApplicationContext(), "選擇圖片檔案出錯", Toast.LENGTH_SHORT).show(); return; } } String[] pojo = {MediaStore.Images.Media.DATA}; @SuppressWarnings("deprecation") Cursor cursor = managedQuery(photoUri, pojo, null, null, null); if (cursor != null) { int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]); cursor.moveToFirst(); picPath = cursor.getString(columnIndex); cursor.close(); } if (picPath != null && (picPath.endsWith(".png") || picPath.endsWith(".PNG") || picPath.endsWith(".jpg") || picPath.endsWith(".JPG"))) { lastIntent.putExtra(KEY_PHOTO_PATH, picPath); setResult(Activity.RESULT_OK, lastIntent); finish(); } else { Toast.makeText(getApplicationContext(), "選擇圖片檔案不正確", Toast.LENGTH_SHORT).show(); } } }
其中會使用到intent的跳轉,我們可以在跳轉期間新增動畫以及背景透明:
<activity
android:name="com.seven.activity.SelectPhotoActivity"
android:screenOrientation="portrait"
android:theme="@style/DialogStyleBottom" >
</activity>