val uri = FileProvider.getUriForFile(this, "me.linjw.demo.fileprovider.provider", file) val intent = Intent() intent.data = uri intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) intent.setClassName("me.linjw.demo.fileprovider.recv", "me.linjw.demo.fileprovider.recv.MainActivity") startActivity(intent)
02-13 06:52:28.921 4292 4292 E AndroidRuntime: Caused by: java.lang.SecurityException: Permission Denial: opening provider androidx.core.content.FileProvider from ProcessRecord{806d30d 4292:me.linjw.demo.fileprovider.recv/u0a53} (pid=4292, uid=10053) that is not exported from UID 1000
由于这个UID 1000太显眼,所以尝试将系统签名去掉发现权限就正常了,实锤是系统签名的原因。
查看出现异常的时候的日志,发现了下面的打印:
1
02-13 06:52:28.486 863 1393 W UriGrantsManagerService: For security reasons, the system cannot issue a Uri permission grant to content://me.linjw.demo.fileprovider.provider/root/data/user/0/me.linjw.demo.fileprovider/files/test.txt [user 0]; use startActivityAsCaller() instead
// Bail early if system is trying to hand out permissions directly; it // must always grant permissions on behalf of someone explicit. final int callingAppId = UserHandle.getAppId(callingUid); if ((callingAppId == SYSTEM_UID) || (callingAppId == ROOT_UID)) { if ("com.android.settings.files".equals(grantUri.uri.getAuthority()) || "com.android.settings.module_licenses".equals(grantUri.uri.getAuthority())) { // Exempted authority for // 1. cropping user photos and sharing a generated license html // file in Settings app // 2. sharing a generated license html file in TvSettings app // 3. Sharing module license files from Settings app } else { Slog.w(TAG, "For security reasons, the system cannot issue a Uri permission" + " grant to " + grantUri + "; use startActivityAsCaller() instead"); return -1; } }
02-15 20:27:24.200 16968 16968 E AndroidRuntime: Process: me.linjw.demo.fileprovider, PID: 16968 02-15 20:27:24.200 16968 16968 E AndroidRuntime: java.lang.RuntimeException: Not allowed to write file descriptors here 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.Parcel.nativeWriteFileDescriptor(Native Method) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.Parcel.writeFileDescriptor(Parcel.java:922) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.ParcelFileDescriptor.writeToParcel(ParcelFileDescriptor.java:1110) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.Parcel.writeParcelable(Parcel.java:1953) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.Parcel.writeValue(Parcel.java:1859) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.Parcel.writeArrayMapInternal(Parcel.java:1024) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.Bundle.writeToParcel(Bundle.java:1304) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.os.Parcel.writeBundle(Parcel.java:1093) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.content.Intent.writeToParcel(Intent.java:11123) 02-15 20:27:24.200 16968 16968 E AndroidRuntime: at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java: 2298)