Android7.0下调用相机闪退的解决方案

1.现象

在项目中调用相机拍照和录像的时候,android4.x,Android5.x,Android6.x均没有问题,在Android7.x下面直接闪退

2.原因分析

Android升级到7.0后对权限又做了一个更新即不允许出现以file://的形式调用隐式APP,需要用共享文件的形式:content:// URI

3.解决方案

下面是打开系统相机的方法,做了android各个版本的兼容:

[java]  view plain  copy
 print ?
  1. import android.app.Activity;  
  2. import android.content.ContentValues;  
  3. import android.content.Intent;  
  4. import android.net.Uri;  
  5. import android.os.Environment;  
  6. import android.provider.MediaStore;  
  7.   
  8. import com.qhcloud.filetransfer.TransferApp;  
  9.   
  10. import java.io.File;  
  11. import java.io.IOException;  
  12. import java.text.SimpleDateFormat;  
  13. import java.util.Date;  
  14.   
  15. /** 
  16.  * Function:相机工具类 
  17.  * 调用相机拍照 
  18.  * 调用相机录像并保存到目录 
  19.  * Created by xuzhuyun on 2017/3/2. 
  20.  */  
  21.   
  22. public class CameraUtil {  
  23.     public static File tempFile;  
  24.     public static final int PHOTO_REQUEST_CAREMA = 1;// 拍照  
  25.     public static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 2;// 拍摄视频  
  26.   
  27.     /** 
  28.      * 打开相机拍照 
  29.      * 
  30.      * @param activity 
  31.      */  
  32.     public static void openCamera(Activity activity) {  
  33.         //獲取系統版本  
  34.         int currentapiVersion = android.os.Build.VERSION.SDK_INT;  
  35.         // 激活相机  
  36.         Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  37.         // 判断存储卡是否可以用,可用进行存储  
  38.         if (hasSdcard()) {  
  39.             SimpleDateFormat timeStampFormat = new SimpleDateFormat(  
  40.                     "yyyy_MM_dd_HH_mm_ss");  
  41.             String filename = timeStampFormat.format(new Date());  
  42.             tempFile = new File(Environment.getExternalStorageDirectory(),  
  43.                     filename + ".jpg");  
  44.             if (currentapiVersion < 24) {  
  45.                 // 从文件中创建uri  
  46.                 Uri uri = Uri.fromFile(tempFile);  
  47.                 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  48.             } else {  
  49.                 //兼容android7.0 使用共享文件的形式  
  50.                 ContentValues contentValues = new ContentValues(1);  
  51.                 contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());  
  52.                 Uri uri = TransferApp.getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);  
  53.                 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  54.             }  
  55.         }  
  56.         // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA  
  57.         activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA);  
  58.     }  
  59.   
  60.   
  61.     /** 
  62.      * 打开相机录像 
  63.      */  
  64.     public static void startToVideo(Activity activity) {  
  65.         //獲取系統版本  
  66.         int currentapiVersion = android.os.Build.VERSION.SDK_INT;  
  67.         Uri fileUri = null;  
  68.         File file = null;  
  69.         Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);  
  70.         try {  
  71.             file = createMediaFile();  
  72.             if (file.exists()) {  
  73.                 fileUri = Uri.fromFile(file); // create a file to save the video  
  74.             }  
  75.         } catch (IOException e) {  
  76.             e.printStackTrace();  
  77.         }  
  78.         if (currentapiVersion < 24) {  
  79.             intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  // set the image file name  
  80.             intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high  
  81.         } else {  
  82.             //兼容android7.0  
  83.             ContentValues contentValues = new ContentValues(1);  
  84.             contentValues.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());  
  85.             Uri uri = activity.getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);  
  86.             intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  87.         }  
  88.         // start the Video Capture Intent  
  89.         activity.startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);  
  90.     }  
  91.   
  92.     /* 
  93.    * 判断sdcard是否被挂载 
  94.    */  
  95.     public static boolean hasSdcard() {  
  96.         return Environment.getExternalStorageState().equals(  
  97.                 Environment.MEDIA_MOUNTED);  
  98.     }  
  99.   
  100.     /** 
  101.      * 创建保存录制得到的视频文件 
  102.      * 
  103.      * @return 
  104.      * @throws IOException 
  105.      */  
  106.     public static File createMediaFile() throws IOException {  
  107.         if (hasSdcard()) {  
  108.             File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(  
  109.                     Environment.DIRECTORY_MOVIES), "CameraVideos");  
  110.             if (!mediaStorageDir.exists()) {  
  111.                 if (!mediaStorageDir.mkdirs()) {  
  112.                     return null;  
  113.                 }  
  114.             }  
  115.             // Create an image file name  
  116.             String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());  
  117.             String imageFileName = "VID_" + timeStamp;  
  118.             String suffix = ".mp4";  
  119.             File mediaFile = new File(mediaStorageDir + File.separator + imageFileName + suffix);  
  120.             return mediaFile;  
  121.         }  
  122.         return null;  
  123.     }  
  124. }  

以上是做了android7.0兼容处理的工具类,录像时保存到了指定目录。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值