そのため、ユーザーがアプリと共有するファイルをアプリでアップロードできるようにしたいと考えています。file:// URL を介してさまざまなファイル エクスプローラーから共有されたファイルを処理し、次に content:// URL を介してたとえばギャラリーから共有されたものを処理するようにしました。DownloadManager からの共有を無作為にテストすることにした以外は、すべて問題ありません。
コードは次のとおりです。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if(intent.getAction() == Intent.ACTION_SEND) {
Uri fileUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
if(fileUri != null) {
if(fileUri.getScheme().equals("content")) {
try {
Uri data = intent.getData();
InputStream input = getContentResolver().openInputStream(fileUri);
//Do something with InputStream
} catch(Exception e) {
//Log exception/show error
}
}
}
}
}
ただし、Uri の「データ」を openInputStream に渡そうとすると、getData() が null を返すため、NullPointerException が発生します。
コードで行っているように、「fileUri」をopenInputStreamに渡そうとすると、セキュリティ例外が発生します。
06-20 12:41:24.310: E/AndroidRuntime(12375): java.lang.SecurityException: Permission Denial: reading com.android.providers.downloads.DownloadProvider uri content://downloads/all_downloads/433 from pid=12375, uid=10212 requires android.permission.ACCESS_ALL_DOWNLOADS, or grantUriPermission()
この権限を追加しようとしましたが、どのアプリでも使用できるようになっていないことがわかりました。
そのため、インテントからファイル データを取得する方法が他にわかりません。うまくいけば、私が見逃していることが明らかな何かがあることを願っています。