Android 相机拍照获取图片并保存到指定位置。
16lz
2021-01-23
爬坑过程很长,都觉得是手机问题了,最后发现还是自己没搞明白。
看看以下文章
简单的 Android 拍照并显示以及获取路径后上传
Android保存Bitmap到本地图库
Android拍照和相册+系统裁剪功能返回图片
动态添加权限。
public void takePhone(View view) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CALL_PHONE2); } else { takePhoto(); } }
拍照的方法
private void takePhoto() {destoryBimap(); String state = Environment.getExternalStorageState(); if (state.equals(Environment.MEDIA_MOUNTED)) { Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, PHOTO_WITH_CAMERA); } else { Toast.makeText(getActivity(), "没有SD卡", Toast.LENGTH_LONG).show(); } }
返回的方法
public void onActivityResult(int req, int res, Intent data) { switch (req) { /** * 拍照的请求标志 */ case PHOTO_WITH_CAMERA: if (res == RESULT_OK) { Uri uri = data.getData(); if (uri != null) { this.photo = BitmapFactory.decodeFile(uri.getPath()); } if (this.photo == null) { Bundle bundle = data.getExtras(); if (bundle != null) { this.photo = (Bitmap) bundle.get("data"); Intent intent = new Intent(getActivity(), CollectActivity.class); intent.putExtra("bm", this.photo); startActivity(intent); } else { Toast.makeText(getActivity(), "拍照失败", Toast.LENGTH_LONG).show(); return; } } FileOutputStream fileOutputStream = null; try { // 获取 SD 卡根目录 String saveDir = Environment.getExternalStorageDirectory() + "/photos"; // 新建目录 File dir = new File(saveDir); if (! dir.exists()) dir.mkdir(); // 生成文件名 SimpleDateFormat t = new SimpleDateFormat("yyyy_MM_ddssSSS"); String filename = "P" + (t.format(new Date())) + ".jpg"; // 新建文件 File file = new File(saveDir, filename); // 打开文件输出流 fileOutputStream = new FileOutputStream(file); // 生成图片文件 this.photo.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); // 相片的完整路径 this.picPath = file.getPath(); } catch (Exception e) { e.printStackTrace(); } finally { if (fileOutputStream != null) { try { fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } try { MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), this.picPath, "photos", null); } catch (FileNotFoundException e) { e.printStackTrace(); } // 最后通知图库更新 getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path))); } else { Log.i("tag", "失败"); } break; default: break; } }
权限 onRequestPermissionsResult方法
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { takePhoto(); } else { Toast.makeText(getActivity(), "权限不够", Toast.LENGTH_SHORT).show(); } } if (requestCode == 3) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { choosePhoto(); } else { Toast.makeText(getActivity(), "权限不够", Toast.LENGTH_SHORT).show(); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }
完
更多相关文章
- Android 3.0之后开机无法接收系统广播权限原因
- Android 权限控制代码分析
- 安装APK文件到Android模拟器
- Android中监听Home键的4种方法总结
- 最新历史版本 :Android修改system只读权限:remount
- Android利用SAX解析XML文件
- Android Canvas绘图描述Android Canvas 方法总结