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的系统需要动态添加权限。

相关内容推荐