1. 程式人生 > >Android開發——相簿拍照_03.解決相機拍照之後部分手機無法將圖片儲存到路徑或部分手機點選相機確定無法返回問題

Android開發——相簿拍照_03.解決相機拍照之後部分手機無法將圖片儲存到路徑或部分手機點選相機確定無法返回問題

之前用了02的方法,實現了相簿拍照功能,但是在測試的時候發現幾個問題:1.拍完照片之後,返回介面,但是顯示出來的圖片為null,一片空白;2.拍完照片之後,點選相機的確定鍵,無法返回。
因為時間有限,網上的回答很多,第一個問題有人說部分手機沒有SD卡?第二個問題有人說部分手機無法使用系統公用路徑?也有人說這兩個都是後面一個原因?
於是打算使用另一種方法,使用彈出框。

當點選圖片控制元件時,彈出彈出框,讓使用者選擇是通過拍照或是通過相簿選擇。

img.setOnClickListener(new OnClickListener()
        {
            @Override
public void onClick(View v) { getPictureDialog(); } });
private void getPictureDialog()
    {
        new AlertDialog.Builder(this).setTitle("請選擇獲取圖片方式")
                .setItems(Resources.ApplyCourier.items, new DialogInterface.OnClickListener()
                {
                    @Override
public void onClick(DialogInterface dialog, int which) { Intent intent = null; switch (which) { case 0: // 呼叫相機拍照並儲存拍照檔案到指定目錄 callCameraTakePhoto(); break
; case 1: // 圖片單選,直接跳轉至系統圖片庫 intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, Resources.ApplyCourier.SELECT_IMAGE); break; } dialog.dismiss(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); }

然後主要是看呼叫相機拍照並儲存到指定目錄這個方法callCameraTakePhoto()

/**
     * 呼叫相機拍照並存儲照片
     */
    private void callCameraTakePhoto()
    {
        String photoName = null;
        // 路徑規則:SD卡路徑(內部儲存)/packageName/DJGX/ + photoName
        photoName = "imagewx.png";
        photoSavePath = Resources.ApplyCourier.PHOTO_FILE_PATH + File.separator + photoName;
        init_pic_dir(Resources.ApplyCourier.PHOTO_FILE_PATH); // 查詢並建立資料夾

        // 啟動相機並拍照
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(photoSavePath)));
        startActivityForResult(intent, Resources.ApplyCourier.CALL_CAMERA);
    }

無論哪一張方法進行圖片選擇,在選擇完成之後,都會呼叫onActivityResult這個方法

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK)
        {
            Options opts = new Options();
            String path = null;
            switch (requestCode)
            {
            case Resources.ApplyCourier.CALL_CAMERA:
                // 呼叫相機拍照
                if (data == null)
                {
                    path = photoSavePath;
                } else
                {
                    // 這部分程式碼可以不用寫,正常通過相機拍照返回,得到的data為null
                    Uri address = data.getData();
                    path = GetRealPathFromUri.getImageAbsolutePath(ApplyCourierActivity.this, address);
                }
                break;
            case Resources.ApplyCourier.SELECT_IMAGE:
                // 呼叫系統圖庫選擇
                if (data != null)
                {
                    // 獲取相簿選擇結果(儲存路徑)
                    Uri address = data.getData();
                    path = GetRealPathFromUri.getImageAbsolutePath(ApplyCourierActivity.this, address);
                } else
                {
                    Toast.makeText(ApplyCourierActivity.this, "圖片選擇出錯", Toast.LENGTH_LONG).show();
                    return;
                }
                break;
            }
            opts.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, opts);
            int inSampleSize = ChooseImageUtils.calculateInSampleSize(opts, dpTopx(reqWidth), dpTopx(100));
            opts.inSampleSize = inSampleSize;
            opts.inJustDecodeBounds = false;
            Bitmap bitmap = BitmapFactory.decodeFile(path, opts);
            Log.e("path", path);
            img.setImageBitmap(bitmap);
        }
    }

上述程式碼塊的後面部分與02的內容是一樣的,對圖片進行縮放處理,用到的類和方法也都在02裡有寫,這裡就不重複了。

在callCameraTakePhoto方法中有呼叫一個方法進行查詢並建立資料夾:

/**
     * 查詢指定路徑檔案是否存在,若不存在就直接建立
     * 
     * @param path
     *            指定路徑
     */
    private void init_pic_dir(String path)
    {
        File d = new File(path + File.separator);
        if (!d.exists())
        {
            d.mkdirs();
        }
    }

這樣處理之後,經過測試,暫時沒有什麼問題,拍照之後的圖片也有正常的顯示出來,當然,6.0的系統需要動態新增許可權。