无法使用API版本23和更高版本中的文件提供程序从外部存储目录访问视频文件。代码如下
我想在视频视图中播放视频,我尝试了很多解决方案,但我无法访问图像文件和视频文件。 它允许我第二次运行应用程序时访问图像文件。 Click to see error, Full 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>
试试这个
第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();
}
}
}
我已经完成了它, –
@ user3828119但是您的错误显示权限被拒绝 –
已添加
你需要问的运行时间许可[阅读本(https://developer.android.com/training/permissions/requesting.html) –
在这里,我已经改变从RecurPostVideos到ImageVideos的文件夹名称。 –
我已经给了运行时权限。 @Nilesh Rathod –