android:authorities= "${applicationId}"这里的应用 id 包含你的项目包名。
在您的应用程序 gradle 文件中定义
defaultConfig {
applicationId "<your app Id>"
minSdkVersion 16
targetSdkVersion 25
versionCode 25
versionName '5.8'
multiDexEnabled true
}
/////
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="<package name>.fileprovider" // which are defined in app gradle application id
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths_public" />
</provider>
你的 xml 文件应该像
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external_files"
path="." />
</paths>
你的java代码就像。这里的文件是你试图访问的文件路径
Uri uri = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() +
".provider", file);
} else {
uri = Uri.fromFile(file);
}
在uri中获得路径后,可以随心所欲地做任何事情。
为了获得真正的路径,试试这个它可能会起作用。
public String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = context.getContentResolver().query(contentURI, null,
null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file
// path
result = contentURI.getPath();
} else {
cursor.moveToFirst();
try {
int idx = cursor
.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
} catch (Exception e) {
AppLog.handleException(ImageHelper.class.getName(), e);
Toast.makeText(context, context.getResources().getString(
R.string.error_get_image), Toast.LENGTH_SHORT).show();
result = "";
}
cursor.close();
}
return result;
}