Trước tiên, bạn cần thêm một nhà cung cấp vào AndroidManifest của bạn
<application
...>
<activity>
....
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.your.package.fileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
bây giờ tạo một tệp trong thư mục tài nguyên xml (nếu sử dụng android studio, bạn có thể nhấn Alt + Enter sau khi tô sáng file_paths và chọn tạo tùy chọn tài nguyên xml)
Tiếp theo trong tập tin file_paths nhập
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="Android/data/com.your.package/" name="files_root" />
<external-path path="." name="external_storage_root" />
</paths>
Ví dụ này dành cho đường dẫn bên ngoài, bạn có thể tham khảo tại đây để có thêm tùy chọn. Điều này sẽ cho phép bạn chia sẻ các tệp trong thư mục đó và thư mục con của nó.
Bây giờ tất cả những gì còn lại là để tạo ra ý định như sau:
MimeTypeMap mime = MimeTypeMap.getSingleton();
String ext = newFile.getName().substring(newFile.getName().lastIndexOf(".") + 1);
String type = mime.getMimeTypeFromExtension(ext);
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(getContext(), "com.your.package.fileProvider", newFile);
intent.setDataAndType(contentUri, type);
} else {
intent.setDataAndType(Uri.fromFile(newFile), type);
}
startActivityForResult(intent, ACTIVITY_VIEW_ATTACHMENT);
} catch (ActivityNotFoundException anfe) {
Toast.makeText(getContext(), "No activity found to open this attachment.", Toast.LENGTH_LONG).show();
}
EDIT : Tôi đã thêm thư mục gốc của thẻ sd trong file_paths. Tôi đã kiểm tra mã này và nó hoạt động.