从摄像头的Andr​​oid 4.4视频提供安全异常摄像头、异常、安全、视频

2023-09-05 00:42:34 作者:山川

我使用下面的code视频录制使用相机

在录制按钮点击code: -

 意图=新的意图(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);
   =了fileURI getOutputMediaFile(MEDIA_TYPE_VIDEO); //创建一个文件保存在指定文件夹的视频(这适用于视频只)
    intent.putExtra(MediaStore.EXTRA_OUTPUT,了fileURI);
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1); //设定视频图像质量高

    //启动视频捕捉意向
    startActivityForResult(意向,REQUEST_VIDEO_CAPTURED_NEXUS);
 

内部开关code - onActivityResult的情况下块: -

 保护无效onActivityResult(INT申请code,INT结果code,意图数据){

        如果(结果code == Activity.RESULT_OK){
            开关(要求code){
    案例REQUEST_VIDEO_CAPTURED_NEXUS:
    this.videoFromCameraNexus(结果code,数据);
    打破;

默认:
                打破;
            }
        }
    }
 

// videoFromCameraNexus方法

 私人无效videoFromCameraNexus(INT结果code,意图数据){

        如果(了fileURI!= NULL){
            Log.d(TAG,视频保存到:\ N+了fileURI);
            Log.d(TAG,视频路径:\ N+ fileUri.getPath());
            Log.d(TAG,视频名称:\ N+的getName(了fileURI));
    //使用uri.getLastPathSegment()如果存放在文件夹中
    //使用文件URI。
        }
    }
 

获取输出媒体文件URI以下方法

 公众开放的getOutputMediaFile(整型)
    {
        //为了安全起见,你应该检查SD卡安装

        如果(Environment.getExternalStorageState()!= NULL){
            //这适用于Android 2.2及以上
            文件mediaStorageDir =新的文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES),SMW_VIDEO);

            //这个位置效果最好,如果你希望共享的创建的图像
            //应用程序之间,坚持后,您的应用程序已被卸载。

            //创建存储目录,如果它不存在
            如果(!mediaStorageDir.exists()){
                如果(!mediaStorageDir.mkdirs()){
                    Log.d(TAG,未能创建目录);
                    返回null;
                }
            }

            //创建一个媒体文件名
            字符串的timeStamp =新的SimpleDateFormat(YYYYMMDD_HHMMSS)格式(新的Date())。
            文件媒体文件;
           如果(类型== MEDIA_TYPE_VIDEO){
                媒体文件=新的文件(mediaStorageDir.getPath()+文件分割符+
                VID _+的timeStamp +.MP4);
            } 其他 {
                返回null;
            }

            返回Uri.fromFile(媒体文件);
        }

        返回null;
 

}

它的作品,我到安卓4.3操作系统,但在Android 4.4我收到 java.lang.SecurityException异常:权限被拒绝:读取com.android.providers.media.MediaProvider

我的logcat的详情如下: -

  11-27 19:34:31.157:E / AndroidRuntime(3876):java.lang.RuntimeException的:不提供结果ResultInfo {谁= NULL,请求= 210,结果=  - 1,数据=意向{DAT =内容://媒体/外部/视频/媒体/ 132}}到活动{com.sus.SUSV7_1.Activity / com.sus.SUSV7_1.Activity.ConnectMeActivity}:java.lang.SecurityException异常:权限被拒绝:阅读com.android.providers.media.MediaProvider URI内容://媒体/外部/视频/从PID = 3876媒体/ 132,UID = 10088要求android.permission.READ_EXTERNAL_STORAG​​E,或grantUriPermission()
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.app.ActivityThread.deliverResults(ActivityThread.java:3346)
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.app.ActivityThread.handleSendResult(ActivityThread.java:3389)
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.app.ActivityThread.access $ 1200(ActivityThread.java:135)
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1445)
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.os.Handler.dispatchMessage(Handler.java:102)
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.os.Looper.loop(Looper.java:137)
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.app.ActivityThread.main(ActivityThread.java:4998)
11-27 19:34:31.157:E / AndroidRuntime(3876):在java.lang.reflect.Method.invokeNative(本机方法)
11-27 19:34:31.157:E / AndroidRuntime(3876):在java.lang.reflect.Method.invoke(Method.java:515)
11-27 19:34:31.157:E / AndroidRuntime(3876):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:777)
11-27 19:34:31.157:E / AndroidRuntime(3876):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
11-27 19:34:31.157:E / AndroidRuntime(3876):在dalvik.system.NativeStart.main(本机方法)
11-27 19:34:31.157:E / AndroidRuntime(3876):java.lang.SecurityException异常:产生的原因权限拒绝:读取com.android.providers.media.MediaProvider URI内容://媒体/外部/视频/媒体从PID =一百三十二分之三千八百七十六,UID = 10088要求android.permission.READ_EXTERNAL_STORAG​​E,或grantUriPermission()
11-27 19:34:31.157:E / AndroidRuntime(3876):在android.os.Parcel.readException(Parcel.java:1461)
 

解决方案

您应该通过将下面一行添加的权限 android.permission.READ_EXTERNAL_STORAG​​E 您的清单文件它:

 <使用-权限的Andr​​oid:名称=android.permission.READ_EXTERNAL_STORAG​​E/>
 

I am using following code for video recording using camera

code on record button click:-

  intent = new Intent(android.provider.MediaStore.ACTION_VIDEO_CAPTURE);    
   fileUri = getOutputMediaFile(MEDIA_TYPE_VIDEO);  // create a file to save the video in specific folder (this works for video only)
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high

    // start the Video Capture Intent
    startActivityForResult(intent, REQUEST_VIDEO_CAPTURED_NEXUS);

code inside switch - case block of onActivityResult :-

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == Activity.RESULT_OK) {
            switch (requestCode) {
    case REQUEST_VIDEO_CAPTURED_NEXUS:
    this.videoFromCameraNexus(resultCode, data);
    break;

default:
                break;
            }
        }
    }

// videoFromCameraNexus method

private void videoFromCameraNexus(int resultCode, Intent data) {

        if(fileUri != null) {
            Log.d(TAG, "Video saved to:\n" + fileUri);
            Log.d(TAG, "Video path:\n" + fileUri.getPath());
            Log.d(TAG, "Video name:\n" + getName(fileUri)); 
    // use uri.getLastPathSegment() if store in folder
    //use the file Uri.
        }
    }

Get the output Media file uri with the following Method

public Uri getOutputMediaFile(int type)
    {
        // To be safe, you should check that the SDCard is mounted

        if(Environment.getExternalStorageState() != null) {
            // this works for Android 2.2 and above
            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES), "SMW_VIDEO");

            // This location works best if you want the created images to be shared
            // between applications and persist after your app has been uninstalled.

            // Create the storage directory if it does not exist
            if (! mediaStorageDir.exists()) {
                if (! mediaStorageDir.mkdirs()) {
                    Log.d(TAG, "failed to create directory");
                    return null;
                }
            }

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile;
           if(type == MEDIA_TYPE_VIDEO) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "VID_"+ timeStamp + ".mp4");
            } else {
                return null;
            }

            return Uri.fromFile(mediaFile);
        }

        return null;

}

Its works for me till android 4.3 os but on Android 4.4 I am getting java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider

My Logcat details are as follows :-

11-27 19:34:31.157: E/AndroidRuntime(3876): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=210, result=-1, data=Intent { dat=content://media/external/video/media/132 }} to activity {com.sus.SUSV7_1.Activity/com.sus.SUSV7_1.Activity.ConnectMeActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/video/media/132 from pid=3876, uid=10088 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3346)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3389)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.app.ActivityThread.access$1200(ActivityThread.java:135)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1445)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.os.Handler.dispatchMessage(Handler.java:102)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.os.Looper.loop(Looper.java:137)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.app.ActivityThread.main(ActivityThread.java:4998)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at java.lang.reflect.Method.invokeNative(Native Method)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at java.lang.reflect.Method.invoke(Method.java:515)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
11-27 19:34:31.157: E/AndroidRuntime(3876):  at dalvik.system.NativeStart.main(Native Method)
11-27 19:34:31.157: E/AndroidRuntime(3876): Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/video/media/132 from pid=3876, uid=10088 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
11-27 19:34:31.157: E/AndroidRuntime(3876):  at android.os.Parcel.readException(Parcel.java:1461)

解决方案

You should add the permission android.permission.READ_EXTERNAL_STORAGE to your manifest file by adding the following line to it :

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 
精彩推荐
图片推荐