android--写真アルバム選択画像[小米など他の携帯電話に対応]

9253 ワード

数日前にプロジェクトの中で画像を选ぶ过程の中で小米の携帯电话が现れて画像をviewの中に入れることができないことに出会って、ここは小米が木の形の构造を采用しているためで、その他の携帯电话は普遍的に図形の构造で、本质はurlの构造が少し异なって、小米のは绝対の経路です
1.定数の定義:
private static final int TAKE_PICTURE = 3;
private static final int CHOOSE_PICTURE = 4;
private static final int CROP_SMALL_PICTURE = 5;

2.写真を撮って、アルバムの画像ロジックを選択して、下の赤い部分は高バージョンと低バージョンのアルバムの画像を選択するコードに互換性があって、問題が発生しません:
public void showPicturePicker(Context context) {
        final String[] stringItems = { "  ", "  " };
        final ActionSheetDialog dialog = new ActionSheetDialog(this, stringItems, null);
        dialog.isTitleShow(false).show();

        dialog.setOnOperItemClickL(new OnOperItemClickL() {
            @Override
            public void onOperItemClick(AdapterView> parent, View view, int position, long id) {
                switch (position) {
                case 0:
                    Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    //         (SD ),image.jpg       ,              
                    openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    startActivityForResult(openCameraIntent, TAKE_PICTURE);
                    dialog.dismiss();
                    break;

                case 1:
                    Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
                    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");  
                    startActivityForResult(intent, CHOOSE_PICTURE); 
                    dialog.dismiss();
                    break;

                default:
                    break;
                }
            }
        });
    }

3.onActivity forResultの論理コード:
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        String absolutePath = Environment.getExternalStorageDirectory().getAbsolutePath();
        String headpic = absolutePath + File.separator + "headpic.png";

        switch (requestCode) {
        case Constant.TO_CHANGENAMEACTIVITY_REQUESTCODE:
            if (data != null) {
                String name = data.getStringExtra("name").trim();
                if (!isNull(name)) {
                    tv_mine_name_content.setText(name);
                }
            }
            break;
        case TAKE_PICTURE:
            cropImageUri(imageUri, 154, 154, CROP_SMALL_PICTURE);
            break;

        case CHOOSE_PICTURE:
            if (data != null) {
                //          
                Uri originalUri = data.getData();
                cropImageUri(originalUri, 154, 154, CROP_SMALL_PICTURE);
            }

            break;
        case CROP_SMALL_PICTURE:
            if(imageUri != null){
                Bitmap bitmap;
                try {
                    bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uritempFile));
                    ImageTools.savePhotoToSDCard(bitmap, absolutePath, "headpic.png");
                    uploadHeadPic(headpic);
                    bitmap.recycle();
                } catch (FileNotFoundException e) {
                    toast("       ");
                    e.printStackTrace();
                } 
            }
            break;
        default:
            break;
        }
    }

uritempFileに注意してください.次のように書かなければなりません.そうしないと、小米の携帯電話でクラッシュします.
Uri uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");

4.カット画像を呼び出す呼び出しがあります.コードは以下の通りです.
private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode){
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);
        intent.putExtra("scale", true);
        //        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        startActivityForResult(intent, requestCode);
    }