安卓关于调用系统相机的问题

软件屋的小项目调用相机不成功是因为没有在系统设置中为应用打开相机使用期限

下面是百度上找到的关于安卓7.0之后的手机版本调用相机方法
1.现象

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

2.原因分析

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

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

[java] view plain copy
 
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;  
    }  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值