選擇圖片上傳基本是標配了,有必要寫好個通用的方法以便使用,以下是一堆代碼,使用的時候粘貼進去就可以了。
基本解決了一些常出現的問題:華為手機適配,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(); }});
新聞熱點
疑難解答