0

ユーザーがファイルで「共有」を押すと、アプリが開き、ファイルのアップロードが開始されるというアクティビティがあります。返される URI は MediaStore 用であるため、これは画像で完全に機能します。しかし、ES File Explorer などの任意のソースから URI を返せるようにしたい

現在のコードは次のとおりです。

    public String getPath(Uri uri) {
      String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
    }

これを MediaStore の代わりにどのような種類のファイルにも使用できるようにするにはどうすればよいですか?

4

2 に答える 2

1

パスステップをスキップして(可能であれば)、物事を少し単純化できる InputStream を取得することをお勧めします。

public InputStream getInputStream(Uri uri) {
    InputStream stream = null;
    String scheme = uri.getScheme();
    try {
        if (ContentResolver.SCHEME_CONTENT.equals(scheme) || ContentResolver.SCHEME_FILE.equals(scheme) || ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {
            stream = getContentResolver().openInputStream(uri);
        } else if ("https".equals(scheme) || "http".equals(scheme)) {
            // ContentResolver can't handle web uris. Handle or skip them as you see fit.
        }           
    } catch (FileNotFoundException e) {
        // Handle the exception however you see fit.
    }
    return stream;
}

ContentResolver を使用して詳細を整理することをお勧めします...たとえば、MediaStore に関連しないコンテンツ URI を取得するとどうなりますか? ContentResolver にそれを処理させることで、気にする必要はありません。

于 2012-07-02T15:27:44.530 に答える
0

そんなことはできません。これらのイメージのパスは組み込みの SQLite データベースに保存されているため、メディア ストアに使用できますが、SD カードのファイルにはデータベースにエントリがありません。

URI のスキームがコンテンツかファイルかを確認し、さまざまな方法を使用して次の方法でファイルにアクセスできます。

public String getPath(Uri uri) {
        if(uri.getScheme().equals("content")){
                String[] projection = { MediaStore.Images.Media.DATA };
                Cursor cursor = managedQuery(uri, projection, null, null, null);
                int column_index = cursor.getColumnIndexOrThrow(
                        MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
        } else if(uri.getScheme().equals("file")){
                File myFile = new File(uri);
                return myFile.getAbsolutePath();
        }
}
于 2012-07-02T15:01:38.163 に答える