2013-11-27 18 views
3

我使用下面的视频录制代码中使用相机从摄像头的Android 4.4视频给安全异常

记录代码按钮点击: -

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); 

开关内部代码 - 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方法

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. 
     } 
    } 

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

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; 

}

其作品对我来说,直到Android 4.3的操作系统,但在Android 4.4我收到java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider

我logcat的详细情况如下: -

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) 
+0

严重,一切都在日志中:'require android.permission.READ_EXTERNAL_STORAGE'。阅读完整的错误信息! – njzk2

+0

但我已经为此设置了权限。它的工作,直到android 4.3 –

+2

'它的工作,直到android 4.3':阅读发行说明:http://developer.android.com/about/versions/android-4.4.html#Behaviors – njzk2

回答

8

您应该为您添加权限android.permission.READ_EXTERNAL_STORAGE r清单文件中加入以下行:

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

这不能解决棉花糖模拟器上的问题... –