无法使用API​​版本23和更高版本中的文件提供程序从外部存储目录访问视频文件。代码如下

问题描述:

我想在视频视图中播放视频,我尝试了很多解决方案,但我无法访问图像文件和视频文件。 它允许我第二次运行应用程序时访问图像文件。 Click to see errorFull Error Log无法使用API​​版本23和更高版本中的文件提供程序从外部存储目录访问视频文件。代码如下

我已经运行时的权限,但系统不会让我访问图像和文件。

这里是我的代码 -

MainActivity `

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    imageView = (ImageView) findViewById(R.id.imageView); 
    videoView = (VideoView) findViewById(R.id.videoView); 

    String image = "/ImageVideos/1501064538061.jpg"; 
    String video = "/ImageVideos/20170707155916_mmy037p0xZzcW.mp4"; 

    MediaController mediaController = new MediaController(this); 

    String strFileDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); 
    String strImgDir = strFileDir + image; 
    String strVideoDir = strFileDir + video; 

    File fileImg = new File(strImgDir); 
    File fileVideo = new File(strVideoDir); 

    if (Build.VERSION.SDK_INT >= 24) { 

     if (!checkPermission()) { 
      requestPermission(); 
     }   

     Uri imgContentUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", fileImg); 

     Uri videoContentUri = FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".provider", fileVideo); 


     this.grantUriPermission(getPackageName(), imgContentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

     this.grantUriPermission(getPackageName(), videoContentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); 

     imageView.setImageURI(imgContentUri); 

     videoView.setVideoPath(String.valueOf(videoContentUri)); 
     mediaController.setAnchorView(videoView); 
     videoView.setMediaController(mediaController); 
     videoView.start(); 
    } 
} 

private void requestPermission() { 
    ActivityCompat.requestPermissions(this, new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_ALL); 
} 

private boolean checkPermission() { 
    int result = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE); 
    int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), READ_EXTERNAL_STORAGE); 
    return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED; 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case PERMISSION_ALL: 
      if (grantResults.length > 0) { 
       boolean WriteExternalAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED; 
       boolean ReadExternalAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED; 
       if (ReadExternalAccepted && WriteExternalAccepted) { 
        //Snackbar.make(view, "Permission Granted, Now you can access location data and camera.", Snackbar.LENGTH_LONG).show(); 
       } else { 
        //Snackbar.make(view, "Permission Denied, You cannot access location data and camera.", Snackbar.LENGTH_LONG).show(); 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
         if (shouldShowRequestPermissionRationale(WRITE_EXTERNAL_STORAGE)) { 
          showMessageOKCancel("You need to allow access to both the permissions", 
            new DialogInterface.OnClickListener() { 
             @Override 
             public void onClick(DialogInterface dialog, int which) { 
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
               requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, 
                 PERMISSION_ALL); 
              } 
             } 
            }); 
          return; 
         } 
        } 
       } 
      } 
      break; 
    } 
} 

` AndroidManifest.xml中

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

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="${applicationId}.provider" 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
    android:name="android.support.FILE_PROVIDER_PATHS" 
    android:resource="@xml/provider_paths"/> 
</provider> 

provider_paths.xml

<path xmlns:android="http://schemas.android.com/apk/res/android"> 
    <root-path name="external_files" path="."/> 
</path> 
+0

你需要问的运行时间许可[阅读本(https://developer.android.com/training/permissions/requesting.html) –

+0

在这里,我已经改变从RecurPostVideos到ImageVideos的文件夹名称。 –

+0

我已经给了运行时权限。 @Nilesh Rathod –

试试这个

第1步: - 在清单文件中添加此权限

android.Manifest.permission.READ_EXTERNAL_STORAGE, 

第二步:让运行许可

String permission = Manifest.permission.READ_EXTERNAL_STORAGE; 
    if (ActivityCompat.checkSelfPermission(SearchCityClass.this, permission) 
      != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(SearchCityClass.this, new String[] 
       {permission}, 1010); 

    } 

第3步:办理permsiion结果

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
             @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == 1010) { 
     if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 


      Toast.makeText(this, location_permission_granted_msg, Toast.LENGTH_SHORT).show(); 

     } else { 

      Toast.makeText(this, location_permission_not_granted_msg, Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 
+0

我已经完成了它, –

+0

@ user3828119但是您的错误显示权限被拒绝 –

+0

已添加,但不起作用 –