Android完全解决6.0以上机型不能拍照选择相册问题
来源:互联网 发布:淘宝助理无法打印 编辑:程序博客网 时间:2024/05/16 11:25
由于最近项目涉及实现上传图片,由手机拍照和从相册选择图片,弄了好几天,最终解决所有问题,包括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
1 0
- Android完全解决6.0以上机型不能拍照选择相册问题
- Android拍照、相册选择
- 解决Android拍照6.0以上动态获取权限问题
- 解决android部分机型拍照后被旋转的问题
- 选择相册图片,修改部分机型错误,4.4以上版本
- Android 拍照和相册选择
- Android 从照相机和相册选择图片使用原生代码裁剪(支持4.4 KIKAT及以上机型)
- android 选择图片 相册选择 马上拍照
- Android 选择图片 相册选择 马上拍照
- 华为手机 6.0 拍照相册选择权限问题
- Android 拍照不同机型的诡异问题
- Android解决部分机型获取不到系统拍照图片,图库图片问题的解决
- Android 从相册和拍照选择图片
- Android 拍照/相册 选择图片工具
- android头像选择(拍照,相册,裁剪)
- android 选择照片(相册/拍照/切图)
- android头像选择(拍照,相册,裁剪)
- Android 从相册选择照片 手机拍照
- easyui 布局
- Activity四种启动模式
- MQ的应用场景
- 前端工作笔记
- Mac系统上Android studio真机调试
- Android完全解决6.0以上机型不能拍照选择相册问题
- DELETE_FAILED_INTERNAL_ERROR Error while Installing APK
- glibc
- CString转char*/wchar_t* 转 char*
- B. USB vs. PS/2(结构体排序)
- 四种电子商务支付模式:支付网关模式、网上银行模式、第三方支付模式和手机支付模式。
- Javascript 元素宽高,偏移以及滚动位置
- fastjson生成json时Null转为空字符串""或者不展示
- mysql alter 操作