由于最近项目涉及实现上传图片,由手机拍照和从相册选择图片,弄了好几天,最终解决所有问题,包括Android6.0不能拍照,选择相册得不到路径,今天特意记录下~
首先需要画好布局,以及工具类 效果图
直接贴代码了,没什么技术含量,只是搜集资料很不容易而已~
case R.id.takePhotoBtnId://拍照 bottomView1.dismiss(); // bottomView.dismiss(); if (PermissionsUtils.isCameraPermission(AddMenuActivity.this, 0x007)) if (i > 5) { ToastCommonUtils.showCommonToast(AddMenuActivity.this, "最多上传5张"); return; } byCamera1();
break;
case R.id.pickPhtotBtnId://相册 Integer sdk_int2 = Integer.valueOf(Build.VERSION.SDK); if (sdk_int2 >= 23) { PermissionGen.with(this) .addRequestCode(100) .permissions( Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_SETTINGS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.GET_ACCOUNTS) .request(); } bottomView1.dismiss(); if (i > 5) { ToastCommonUtils.showCommonToast(AddMenuActivity.this, "最多上传5张"); } 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, 4); break;
public void byCamera1() { String savePath = ""; String storageState = Environment.getExternalStorageState(); if (storageState.equals(Environment.MEDIA_MOUNTED)) { savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/camera/"; File savedir = new File(savePath); if (!savedir.exists()) { savedir.mkdirs(); } } // 没有挂载SD卡,无法保存文件 if (savePath == null || "".equals(savePath)) { System.out.println("无法保存照片,请检查SD卡是否挂载"); return; } b++; String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss" + b).format(new Date()); //照片命名 String fileName = timeStamp + ".png"; File out = new File(savePath, fileName); Uri uri = Uri.fromFile(out); //该照片的绝对路径 path = savePath + fileName; Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, 0x003); }@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == 3) { list.add(0, path); adapter.notifyDataSetChanged(); Bitmap bitmap = getSmallBitmap(path, 400, 400); i++; try { FileOutputStream os = new FileOutputStream(path); bitmap.compress(Bitmap.CompressFormat.JPEG, 80, os); os.flush(); os.close(); if (!bitmap.isRecycled()) { bitmap.recycle(); } } catch (Exception e) { Log.e("mate", Log.getStackTraceString(e)); } } if (resultCode == RESULT_OK && requestCode == 2) { Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); try { Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri)); int sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK); Log.d("sdkVersion:", String.valueOf(sdkVersion)); Log.d("KITKAT:", String.valueOf(Build.VERSION_CODES.KITKAT)); if (sdkVersion >= 19) { // 或者 android.os.Build.VERSION_CODES.KITKAT这个常量的值是19 path1 = uri.getPath();//5.0直接返回的是图片路径 Uri.getPath is : /document/image:46 ,5.0以下是一个和数据库有关的索引值 System.out.println("path:" + path); // path_above19:/storage/emulated/0/girl.jpg 这里才是获取的图片的真实路径 path1 = getPath_above19(AddMenuActivity.this, uri); addThemeIv.setImageBitmap(PermissionsUtils.getBitmapByPath(path1, 100, 100)); } else { path1 = getFilePath_below19(uri); addThemeIv.setImageBitmap(PermissionsUtils.getBitmapByPath(path1, 100, 100)); } } catch (FileNotFoundException e) { Log.e("Exception", e.getMessage(), e); } Uri selectedImage = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); if (cursor != null) { cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); path1 = cursor.getString(columnIndex); cursor.close(); } } if (resultCode == RESULT_OK && requestCode == 4) { Uri uri = data.getData(); ContentResolver cr = this.getContentResolver(); try { Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri)); /* 将Bitmap设定到ImageView */ // iv_local_pic.setImageBitmap(bitmap); int sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK); Log.d("sdkVersion:", String.valueOf(sdkVersion)); Log.d("KITKAT:", String.valueOf(Build.VERSION_CODES.KITKAT)); if (sdkVersion >= 19) { // 或者 android.os.Build.VERSION_CODES.KITKAT这个常量的值是19 path = uri.getPath();//5.0直接返回的是图片路径 Uri.getPath is : /document/image:46 ,5.0以下是一个和数据库有关的索引值 System.out.println("path:" + path); // path_above19:/storage/emulated/0/girl.jpg 这里才是获取的图片的真实路径 path = getPath_above19(AddMenuActivity.this, uri); list.add(0, path); adapter.notifyDataSetChanged(); i++; System.out.println("path_above19:" + path); } else { path = getFilePath_below19(uri); list.add(0, path); adapter.notifyDataSetChanged(); } } catch (FileNotFoundException e) { Log.e("Exception", e.getMessage(), e); } } }我的做法是把所有的路径都加入list集合中,在适配器中转换成bitmap,显示出来,整体思路就这么多,如果有疑问 咨询我qq 1921940606