私のアプリには、ファイルの種類に応じて外部ビューアーで開くことができるようにしたい内部ファイルがあります。アプリケーション マニフェストで次のように FileProvider を設定しています。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/paths" />
</provider>
ファイルを表示するために、次のコードを使用してアプリケーション セレクターを表示します。
Uri contentUri = getUriForFile(getApplicationContext(), "com.myapp.fileprovider", thisFile);
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
String mimeType = getApplicationContext().getContentResolver().getType(contentUri);
viewIntent.setDataAndType(contentUri, mimeType);
viewIntent.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
try {
startActivity(viewIntent);
} catch(ActivityNotFoundException e) {}
これはほとんどのアプリでうまく機能しますが、リストで Google+ フォト アプリを選択した場合、画像は Google+ フォトで正常にロードされますが、指でピンチして画像を拡大しようとするとすぐにクラッシュします。Google+ フォトがファイルへのアクセスを失ったようで、再度読み取ろうとするとアクセスが拒否されます。
私が試した他のすべてのアプリは完全に機能します