android 相機和相冊獲取相片剪裁報錯問題解決,機型也解決

 背景:在上個星期,我想要做一個頭像上傳功能,然而我用的是華爲手機,聽說華爲和小米的適配特別難做,果不其然,也有人建議我去自定義一個圖片剪裁工具,當然有開源的我就直接用了。 也好使,但是我就是想要在原始的代碼上去解決這個問題。結果也是解決了問題。

一般情況中的問題:

1.oom 

2.圖片方向不對

3.activity result 的時候data == null

4.調用圖庫的時候沒找到軟件

以上的問題基本都解決了,但是我今天遇到的問題是第三個,data == null。這個的現象就是,照了相之後跳到圖片剪裁,但是在剪裁哪兒剪裁之後就沒有反應了,對,沒有反應或者就是報錯,報的是空指針。

先把做好的給你看看,我的是華爲手機,嘿嘿,然後也有源碼供你們下載。


直接說怎麼解決:

1,在截圖這兒的代碼,中

intent.putExtra("return-data", false);//設置爲不返回數據

在我看的很多博客中都把“return-data”設置爲了true然後在onActivityResult中通過data.getParcelableExtra("data")來獲取數據,不過這樣的話dp這個變量的值就不能太大了,不然你的程序就掛了。這裏也就是我遇到問題的地方了,在大多數高配手機上這樣用是沒有問題的,不過很多低配手機就有點hold不住了,直接就異常了,包括我們的國產神機小米也沒能hold住,所以我建議大家不要通過return data 大數據,小數據還是沒有問題的,說以我們在剪切圖片的時候就儘量使用Uri這個東東來幫助我們。

     * 進行截圖
     * @param context Activity上下文對象
     * @param uri  Uri
     * @param size  大小
     */
    public static void startPhotoZoom(Activity context,Uri uri, int size) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        // crop爲true是設置在開啓的intent中設置顯示的view可以剪裁
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);// 去黑邊
        intent.putExtra("scaleUpIfNeeded", true);// 去黑邊
        // aspectX aspectY 是寬高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        // outputX,outputY 是剪裁圖片的寬高
        intent.putExtra("outputX", size);
        intent.putExtra("outputY", size);

        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        </span><span style="color:#ff6666;">intent.putExtra("return-data", false);//設置爲不返回數據

        context.startActivityForResult(intent, Configs.SystemPicture.PHOTO_REQUEST_CUT);
    }
2,就是在剪裁圖片之後將圖片result返回,
<span style="color:#373737;">@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case Configs.SystemPicture.PHOTO_REQUEST_TAKEPHOTO: // 拍照
                Log.i("iiiiiii","1232343");
                SelectHeadTools.startPhotoZoom(this,photoUri, 600);
                break;
            case Configs.SystemPicture.PHOTO_REQUEST_GALLERY://相冊獲取
                if (data !=null)
                    photoUri = data.getData();
                SelectHeadTools.startPhotoZoom(this, data.getData(), 600);
                break;
            case Configs.SystemPicture.PHOTO_REQUEST_CUT:  //接收處理返回的圖片結果,這個過程比較重要
                Log.i("iiiiiii_cut","1232343");
                if (photoUri==null)
                    break;
                /*Bitmap bit = data.getExtras().getParcelable("data"); </span><span style="color:#ff6666;"> //不要再用data的方式了,會出現activity result 的時候data == null的空的情況
                try
                {
                    cropBitmap  = getBitmapFromUri(photoUri, this); /</span><span style="color:#ff6666;">//通過獲取uri的方式,直接解決了報空和圖片像素高的oom問題

                    if (cropBitmap != null) {
                        iv_show.setImageBitmap(cropBitmap);
                    }

                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

                //下面可以用來上傳pc服務端
                File file = FileTools.getFileByUri(this,photoUri);
                Log.d("File",file.toString());
                break;
        }
    }

    public  Bitmap getBitmapFromUri(Uri uri,Context mContext)
    {
        try
        {
            </span><span style="color:#ff6666;">// 讀取uri所在的圖片</span><span style="color:#373737;">
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);
            return bitmap;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }
對,通過這樣的方式就能解決該問題。

紀實:2016.2.22

源碼地址:http://download.csdn.net/detail/syif88/9439230

以及自定義相片剪裁工具源碼地址:http://download.csdn.net/detail/syif88/9439235

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章