0

私が達成しようとしているのは、非常によく知られているように聞こえます.スタックオーバーフローにも何度も投稿されていますが、私はそれを成し遂げることができません.

シナリオは、カスタム拡張子を持つ添付ファイル付きのメールを受け取ります。拡張機能はアプリによって認識され、処理するには FilePath が必要です。

現在、アプリで添付ファイルを取得するgetIntent().getData()と、フォームのパスがすべて取得されますcontent://

content://タイプのメディア コンテンツを FilePath のように変換する方法を見てきまし/sdcard/file.extたが、それを使用して添付ファイルを変換できませんでした。明らかかもしれません。

content://実際にダウンロードせずに型を処理する方法はありますか?

現在、k9メールアプリから、カスタム拡張機能を取得すると、アプリがリストに表示されて開きますが、FilePathのようなものが必要で、タイプ/sdcard/file.extしか取得できませんcontent://

質問が明確になったことを願っています。

助けてください。

よろしく。

4

1 に答える 1

0

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; 
}
于 2013-05-16T06:11:22.093 に答える