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


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

今天因為app的需求我研究了下.現在分享下.

其實不論是通過拍照還是從相冊選取都會用到Intent

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

首先,需要設計下我們想怎么調用系統的拍照或者選取圖片的方法

我們可以點擊頭像或者一個按鈕然后彈出一個對話框,讓用戶自己

選擇是拍照還是選擇圖片(如下圖)

.

那這個對話框怎么寫呢.通過AlertDialog來實現(我們就給這個方法起名叫dialog):

//對頭像操作
    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):

/**
     * 拍照獲取圖片
     */
    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()的具體參數信息可以自行查文檔或者百度.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM