国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

安卓選擇相冊或者相機圖片并裁剪適配華為小米機型

2019-11-09 14:05:23
字體:
來源:轉載
供稿:網友

選擇圖片上傳基本是標配了,有必要寫好個通用的方法以便使用,以下是一堆代碼,使用的時候粘貼進去就可以了。

基本解決了一些常出現的問題:華為手機適配,6.0權限申請,圖片大小控制。

1、關于權限問題,我們使用一個開源庫:

dependencies {    compile fileTree(include: ['*.jar'], dir: 'libs')    compile 'com.mylhyl:acp:1.1.7'}相機與相冊都需要讀寫權限,相機還需要照相權限。

2、具體代碼,拷貝就能用:

// 拍照成功,讀取相冊成功,裁減成功PRivate final int ALBUM_OK = 101, CAMERA_OK = 102, CUT_OK = 103;private File bitfile;

private void xiangji() {    Acp.getInstance(mContext).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA).build(), new AcpListener() {        @Override        public void onGranted() {            File dou = new File(Environment.getExternalStorageDirectory(), "dou");            if (!dou.exists()) {                dou.mkdirs();// 2.創建相片的存儲目錄            }            // 定義拍照后存放圖片的文件位置和名稱,使用完畢后可以方便刪除            String fileName = new SimpleDateFormat("ss-SSS")                    .format(new Date()) + ".jpg";            bitfile = new File(dou, fileName);            // 來自相機            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            // 下面這句指定調用相機拍照后的照片存儲的路徑            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile));            startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判斷返回結果的標識        }        @Override        public void onDenied(List<String> list) {            Qiuutil.ShortToast(list.toString() + "權限拒絕");        }    });}private void xiangce() {    Acp.getInstance(PersonInfoActivity.this).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).build(), new AcpListener() {        @Override        public void onGranted() {            File dou = new File(Environment.getExternalStorageDirectory(), "dou");            if (!dou.exists()) {                dou.mkdirs();// 2.創建相片的存儲目錄            }            // 定義拍照后存放圖片的文件位置和名稱,使用完畢后可以方便刪除            String fileName = new SimpleDateFormat("ss-SSS")                    .format(new Date()) + ".jpg";            bitfile = new File(dou, fileName);            // 來自相冊            Intent albumIntent = new Intent(Intent.ACTION_PICK, null);            /**             * 下面這句話,與其它方式寫是一樣的效果,如果:             * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);             * intent.setType(""image/*");設置數據類型             * 要限制上傳到服務器的圖片類型時可以直接寫如:"image/jpeg 、 image/png等的類型"             */            albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");            startActivityForResult(albumIntent, ALBUM_OK);        }        @Override        public void onDenied(List<String> list) {            Qiuutil.ShortToast(list.toString() + "權限拒絕");        }    });}
/** * 裁剪圖片方法實現 * * @param uri  圖片uri * @param type 類別:相機,相冊 */public void clipPhoto(Uri uri, int type) {    Intent intent = new Intent("com.android.camera.action.CROP");    intent.setDataAndType(uri, "image/*");    // 下面這個crop = true是設置在開啟的Intent中設置顯示的VIEW可裁剪    intent.putExtra("crop", "true");    // aspectX aspectY 是寬高的比例,這里設置的是正方形(長寬比為1:1)    intent.putExtra("aspectX", 1);    intent.putExtra("aspectY", 1);    // outputX outputY 是裁剪圖片寬高    intent.putExtra("outputX", 300);    intent.putExtra("outputY", 300);    intent.putExtra("return-data", false);    /**     * 此處做一個判斷     * 1,相機取到的照片,我們把它做放到了定義的目錄下。就是file     * 2,相冊取到的照片,這里注意了,因為相冊照片本身有一個位置,我們進行了裁剪后,要給一個裁剪后的位置,     *   不然onActivityResult方法中,data一直是null     */    if (type == CAMERA_OK) {        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);    } else {        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(bitfile));    }    startActivityForResult(intent, CUT_OK);}

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    System.out.println("requestCode = " + requestCode);    switch (requestCode) {        // 如果是直接從相冊獲取        case ALBUM_OK:            //從相冊中獲取到圖片了,才執行裁剪動作            if (data != null) {                clipPhoto(data.getData(), ALBUM_OK);                //setPicToView(data);            }            break;        // 如果是調用相機拍照時        case CAMERA_OK:            // 當拍照到照片時進行裁減,否則不執行操作            if (bitfile.exists()) {                clipPhoto(Uri.fromFile(bitfile), CAMERA_OK);//開始裁減圖片            }            break;        // 取得裁剪后的圖片,這里將其設置到imageview中        case CUT_OK:            /**             * 非空判斷大家一定要驗證,如果不驗證的話, 在剪裁之后如果發現不滿意,             * 要重新裁剪,丟棄 當前功能時,會報NullException             */            if (data != null) {                try {                    //   Bitmap bm = BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData()));                    //   i1.setImageBitmap(bitmap);                    Bitmap bm = BitmapFactory.decodeFile(bitfile.getAbsolutePath());
//這里獲取了Bitmap,就可以進行顯示操作,而一般上傳去網上,可以使用文件路徑bitfile.getAbsolutePath(),// 這不推薦用data進行數據操作,特別因為華為手機方法與其他手機不一致,容易bug。                    mRoundImageView2.setImageBitmap(bm);                    Qiuutil.LogE(Uri.fromFile(bitfile) + ":" + bitfile.getAbsolutePath());                                   } catch (Exception ex) {                    ex.printStackTrace();                }            } else {                Log.e("圖片數據獲取Main", "data為空");            }            break;        default:            break;    }    super.onActivityResult(requestCode, resultCode, data);}

調用時:

mTextView2.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        //xiangji();        xiangce();    }});


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 团风县| 南郑县| 石家庄市| 平邑县| 景洪市| 常熟市| 呼图壁县| 上蔡县| 启东市| 托克托县| 钟祥市| 咸宁市| 怀柔区| 镇原县| 桓仁| 凤城市| 海阳市| 宜宾市| 呈贡县| 博白县| 百色市| 盐山县| 曲麻莱县| 吴堡县| 峨眉山市| 深水埗区| 鹤壁市| 海原县| 饶阳县| 和林格尔县| 涿州市| 瑞安市| 大新县| 大关县| 左云县| 桂林市| 仙居县| 天水市| 油尖旺区| 临海市| 信阳市|