当前位置:   article > 正文

Android 开发调用本机图库中图片和调用本机摄像头拍照_android实现调用系统相机拍照demo

android实现调用系统相机拍照demo

注意:android7.0以上拍照会闪退,需要调用以下代码

  1. // android 7.0以上系统解决拍照的问题
  2. private void initPhotoError(){
  3. StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
  4. StrictMode.setVmPolicy(builder.build());
  5. builder.detectFileUriExposure();
  6. }

一、权限配置

  1. <uses-permission android:name="android.permission.INTERNET" /><!--网络权限-->
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--写入权限-->
  3. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!--读取权限-->

代码中区分跳转图库和摄像头属性

  1. private final int GALLERY = 0;// 图库
  2. private final int TAKE_PHOTO = 1;// 拍照

二、调用本机图库方法

  1. // 创建Intent,用于打开手机本地图库选择图片
  2. Intent base_pic = new Intent(Intent.ACTION_PICK,
  3. android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  4. //选择图片格式
  5. base_pic.setType("image/*");
  6. // 启动intent打开本地图库
  7. startActivityForResult(base_pic,GALLERY);

获取到选中的图片并保存到自定义文件夹

  1. /**
  2. * 跳转页面返回方法
  3. * */
  4. @Override
  5. public void onActivityResult(int requestCode,int resultCode,Intent data) {
  6. super.onActivityResult(requestCode,resultCode,data);
  7. switch (requestCode){
  8. //处理图库返回
  9. case GALLERY:
  10. if(resultCode == RESULT_OK){
  11. Uri selectedImage = data.getData();
  12. try {
  13. InputStream imageIS = getActivity().getContentResolver().openInputStream(selectedImage);
  14. // 获取图片流
  15. Bitmap bitmap = BitmapFactory.decodeStream(imageIS);
  16. // 调用保存图片方法
  17. saveBitmapFile(bitmap);
  18. } catch (FileNotFoundException e) {
  19. e.printStackTrace();
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. break;
  25. }
  26. /**设置拍照保存后再次跳到拍照界面**/
  27. if (resultCode == RESULT_OK && requestCode == 1){
  28. // 图片名称
  29. String imgName = new Date().getTime() + ".jpg";
  30. Uri uri = getTakePhotoUri(paramFile,imgName);
  31. // 创建Intent,用于调用摄像头
  32. Intent tp_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  33. //存放相机返回的图片
  34. tp_intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
  35. // 启动intent调用本机摄像头
  36. startActivityForResult(tp_intent,TAKE_PHOTO);
  37. }
  38. }
  39. /**
  40. * 保存图库选取的图片
  41. * */
  42. public void saveBitmapFile(Bitmap bitmap){
  43. File galleyFile = new File(Environment.getExternalStorageDirectory(),"图库图片");
  44. File temp = new File(galleyFile.getPath());//要保存文件先创建文件夹
  45. if (!temp.exists()) {
  46. temp.mkdir();
  47. }
  48. // 图片名称
  49. String imgName = new Date().getTime() + ".jpg";
  50. //将要保存图片的路径和图片名称
  51. File file=new File(galleyFile.getPath()+File.separator+imgName);
  52. try {
  53. BufferedOutputStream bos= new BufferedOutputStream(new FileOutputStream(file));
  54. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
  55. bos.flush();
  56. bos.close();
  57. Toast.makeText(getContext(),
  58. "路径:"+galleyFile.getPath(),
  59. Toast.LENGTH_SHORT).show();
  60. } catch (IOException e) {
  61. e.printStackTrace();
  62. }
  63. }

 三、调用本机摄像头拍照方法

  1. // 创建Intent,用于调用摄像头
  2. Intent tp_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  3. // 图片名称
  4. String imgName = new Date().getTime() + ".jpg";
  5. //存放相机返回的图片
  6. tp_intent.putExtra(MediaStore.EXTRA_OUTPUT, getTakePhotoUri(imgName));
  7. // 启动intent调用本机摄像头
  8. startActivityForResult(tp_intent,TAKE_PHOTO);

获取Uri方法(拍照后的图片保存路径)

  1. /**
  2. * 设置相机拍照返回图片路径
  3. * */
  4. private Uri getTakePhotoUri(String imgName){
  5. File photoFile = new File(Environment.getExternalStorageDirectory(), "岩芯图片");
  6. if (!photoFile.exists()) {
  7. photoFile.mkdirs();
  8. }
  9. //将要保存图片的路径和图片名称
  10. File file = new File(photoFile+File.separator+imgName);
  11. Uri uri = Uri.fromFile(file);
  12. return uri;
  13. }

四、配置文件修改(高版本无法获取图片)

  1. apply plugin: 'com.android.application'
  2. android {
  3. compileSdkVersion 28
  4. defaultConfig {
  5. applicationId "com.chy.democamera"
  6. minSdkVersion 21
  7. targetSdkVersion 28
  8. versionCode 1
  9. versionName "2.0"
  10. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  11. }
  12. buildTypes {
  13. release {
  14. minifyEnabled false
  15. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  16. }
  17. }
  18. lintOptions {
  19. checkReleaseBuilds false
  20. abortOnError false
  21. }
  22. sourceSets {
  23. main {
  24. jniLibs.srcDir 'libs'
  25. }
  26. }
  27. }
  28. repositories {
  29. mavenCentral()
  30. google()
  31. }
  32. dependencies {
  33. implementation fileTree(include: ['*.jar'], dir: 'libs')
  34. implementation 'com.android.support:appcompat-v7:28.0.0'
  35. implementation 'com.android.support:support-v4:28.0.0'
  36. implementation 'com.android.support:design:28.0.0'
  37. implementation 'com.android.support.constraint:constraint-layout:1.1.3'
  38. testImplementation 'junit:junit:4.12'
  39. androidTestImplementation 'com.android.support.test:runner:1.0.2'
  40. androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
  41. implementation 'com.github.bumptech.glide:glide:4.9.0'
  42. annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
  43. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/175408
推荐阅读
相关标签
  

闽ICP备14008679号