Android 拍照或者從相冊獲取圖片的實現

咱們經常會用到上傳頭像,或者發帖子的時候選擇本地圖片上傳的功能.這個很常見android

今天由於app的需求我研究了下.如今分享下.app

其實不管是經過拍照仍是從相冊選取都會用到Intentide

這是系統提供給咱們用來調用系統方法的好用工具!工具

首先,須要設計下咱們想怎麼調用系統的拍照或者選取圖片的方法ui

咱們能夠點擊頭像或者一個按鈕而後彈出一個對話框,讓用戶本身this

選擇是拍照仍是選擇圖片(以下圖)spa

.設計

那這個對話框怎麼寫呢.經過AlertDialog來實現(咱們就給這個方法起名叫dialog):code

//對頭像操做
    private void dialog() { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("提示"); builder.setMessage("請選擇修改頭像方式"); //調用相機拍照
        builder.setPositiveButton("拍照", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { takePhoto(); } }); //從相冊裏面取照片
        builder.setNegativeButton("相冊", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { pickPhoto(); } }); builder.create().show(); }

而後就要實現拍照和相冊選擇功能(經過intent):blog

/** * 拍照獲取圖片 */
    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(MediaStore.EXTRA_OUTPUT, photoUri); // intent.putExtra("uri" , photoUri);
            /**-----------------*/ startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO); } else { Toast.makeText(this, "內存卡不存在", Toast.LENGTH_LONG).show(); } } /*** * 從相冊中取圖片 */
    private void pickPhoto() { //AndroidImagePicker.getInstance().setSelectMode(AndroidImagePicker.Select_Mode.MODE_MULTI);
        Intent intent = new Intent(Intent.ACTION_PICK, null); //經過Intent 篩選全部的圖片
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(intent, REQ_IMAGE); }
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);調用系統拍照的功能

  經過重寫onActivityResult的方法獲取經過

 startActivityForResult()傳來的信息(主要是拍照圖片的uri).

獲取該uri:
Uri uri = data.getData();

獲取了uri後就能夠給相應的控件設置背景.好比(是給頁面設置背景):
bt = MediaStore.Images.Media.getBitmap(this.getContentResolver() , uri); im.setImageBitmap(bt);

bt是Bitmap類型im是ImageView類型而且已經綁定控件.



在startActivityForResult()的參數中包含了(Intent data 改參數主要存放選中或者拍照的uri) 
Intent intent = new Intent(Intent.ACTION_PICK, null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
這兩句就是調用系統圖片選擇的方法.一樣經過
startActivityForResult()傳遞參數

startActivityForResult(Intent , int)
這個方法與onActivityResult()配套使用
它的第一個參數用來傳遞intetn信息 , 第二個參數是本身定義的常量用來惟一標識他的intent
onActivityResult()的第二個參數便是這個惟一標識.第三個參數是intent信息.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == SELECT_PIC_BY_TACK_PHOTO) { String[] pojo = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.TITLE, MediaStore.Images.Media.SIZE}; Cursor cursor = getContentResolver().query(photoUri, pojo, null, null, null); if (cursor != null) { cursor.moveToFirst(); String picpath = cursor.getString(cursor.getColumnIndexOrThrow(pojo[0])); ImageItem item = new ImageItem( picpath , cursor.getString(cursor.getColumnIndexOrThrow(pojo[1])) , cursor.getInt(cursor.getColumnIndexOrThrow(pojo[2]))); if (picpath != null && (picpath.endsWith(".png") || picpath.endsWith(".PNG") || picpath.endsWith(".jpg"))) { File file = new File(picpath); Bitmap bt = BitmapFactory.decodeFile(picpath); mText1.setText(picpath); bt = getimage(picpath); im.setImageBitmap(bt); } else { Toast.makeText(this, "選擇圖片文件不正確", Toast.LENGTH_LONG).show(); } cursor.close(); } } else { Bitmap bt = null; try { Uri uri = data.getData(); mText1.setText(uri.toString()); bt = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); im.setImageBitmap(bt); } catch (IOException e) { e.printStackTrace(); } } }
就是這些.關於onActivityResult()的具體參數信息能夠自行查文檔或者百度.
相關文章
相關標籤/搜索