1.现象 在项目中调用相机拍照和录像的时候,android4.x,Android5.x,Android6.x均没有问题,在Android7.x下面直接闪退 2.原因分析 Android升级到7.0后对权限又做了一个更新即不允许出现以file://的形式调用隐式APP,需要用共享文件的形式:content:// URI 3.解决方案 下面是打开系统相机的方法,做了 android各个版本的兼容: import android.app.Activity;   import android.content.ContentValues;   import android.content.Intent;   import android.net.Uri;   import android.os.Environment;   import android.provider.MediaStore;      import com.qhcloud.filetransfer.TransferApp;      import java.io.File;   import java.io.IOException;   import java.text.SimpleDateFormat;   import java.util.Date;      /**   * Function:相机工具类   * 调用相机拍照  * 调用相机录像并保存到目录   * Created by xuzhuyun on 2017/3/2.   */      public class CameraUtil {       public static File tempFile;       public static final int PHOTO_REQUEST_CAREMA = 1;// 拍照       public static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 2;// 拍摄视频          /**       * 打开相机拍照       *       * @param activity       */       public static void openCamera(Activity activity) {           //獲取系統版本           int currentapiVersion = android.os.Build.VERSION.SDK_INT;           // 激活相机           Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);           // 判断存储卡是否可以用,可用进行存储           if (hasSdcard()) {               SimpleDateFormat timeStampFormat = new SimpleDateFormat(                       "yyyy_MM_dd_HH_mm_ss");               String filename = timeStampFormat.format(new Date());               tempFile = new File(Environment.getExternalStorageDirectory(),                       filename + ".jpg");               if (currentapiVersion < 24) {                   // 从文件中创建uri                   Uri uri = Uri.fromFile(tempFile);                   intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);               } else {                   //兼容android7.0 使用共享文件的形式                   ContentValues contentValues = new ContentValues(1);                   contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());                   Uri uri = TransferApp.getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);                   intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);               }           }           // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA           activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA);       }             /**       * 打开相机录像       */       public static void startToVideo(Activity activity) {           //獲取系統版本           int currentapiVersion = android.os.Build.VERSION.SDK_INT;           Uri fileUri = null;           File file = null;           Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);           try {               file = createMediaFile();               if (file.exists()) {                   fileUri = Uri.fromFile(file); // create a file to save the video               }           } catch (IOException e) {               e.printStackTrace();           }           if (currentapiVersion < 24) {            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  // set the image file name               intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high           } else {               //兼容android7.0               ContentValues contentValues = new ContentValues(1);              contentValues.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());               Uri uri = activity.getApplication().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);               intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);           }           // start the Video Capture Intent           activity.startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);       }          /*     * 判断sdcard是否被挂载     */       public static boolean hasSdcard() {           return Environment.getExternalStorageState().equals(                   Environment.MEDIA_MOUNTED);       }          /**       * 创建保存录制得到的视频文件       *       * @return       * @throws IOException       */       public static File createMediaFile() throws IOException {           if (hasSdcard()) {               File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(                       Environment.DIRECTORY_MOVIES), "CameraVideos");               if (!mediaStorageDir.exists()) {                   if (!mediaStorageDir.mkdirs()) {                       return null;                   }               }               // Create an image file name               String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());               String imageFileName = "VID_" + timeStamp;               String suffix = ".mp4";               File mediaFile = new File(mediaStorageDir + File.separator + imageFileName + suffix);               return mediaFile;           }           return null;       }   }  
以上是做了android7.0兼容处理的工具类,录像时保存到了指定目录。

更多相关文章

  1. Android学习——MediaScanner源码分析
  2. android 判断横竖屏
  3. Android横竖屏切换相关总结
  4. [置顶] Android(安卓)调用js,传对象到js里面使用addJavascriptInt
  5. Android(安卓)WebView中javascript和java的互相调用
  6. Android(安卓)Scroll详解(二):OverScroller实战
  7. Cocos2D 如何做 Android(安卓)适配
  8. X86 Android与ARM Android在应用上的兼容
  9. 【Android】开机自启动Service

随机推荐

  1. Android(安卓)IPC机制(三):浅谈Binder的
  2. Android编程内存溢出与防范方法浅析
  3. Mac OS X下用Eclipse浏览和编译Android源
  4. Android事件分发机制完全解析,带你从源码
  5. Android的开篇
  6. Android(安卓)架构大致分析
  7. Android嵌入式开发初学者的几个注意点
  8. Android(安卓)Support 包里究竟有什么
  9. Android(安卓)的网络编程(12)-Android定
  10. Android启动方式简述