content://
Uri は必ずしも SD カード上のファイルを指しているわけではありません。データベースに保存されているあらゆる種類のデータ、または別のアプリのプライベート ファイル ストレージへのアクセスを提供するコンテンツ プロバイダーを指している可能性が高くなります。
後者はメールの添付ファイルの場合だと思います (コンテンツ プロバイダーが Web サーバーから直接要求していない場合)。そのため、Uri をパスに変換してcontent://
も機能しません。
私は次のことを行いました(k9メールアプリでも機能するかどうかはわかりません)
Uri uri = intent.getData();
if (uri.getScheme().equals("content")) {
String fileName = ContentProviderUtils.getAttachmentName(this, uri);
if (fileName.toLowerCase().endsWith(".ext")) {
InputStream is = this.getContentResolver().openInputStream(uri);
// do something
} else {
// not correct extension
return;
}
} else if (uri.getScheme().equals("file")) {
String path = uri.getPath();
if (path.toLowerCase().endsWith(".ext")) {
InputStream is = new FileInputStream(path);
// do something
} else {
// not correct extension
return;
}
}
添付ファイル名は、
public static String getAttachmentName(Context ctxt, Uri contentUri) {
Cursor cursor = ctxt.getContentResolver().query(contentUri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null);
String res = "";
if (cursor != null){
cursor.moveToFirst();
int nameIdx = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME);
res = cursor.getString(nameIdx);
cursor.close();
}
return res;
}