web-dev-qa-db-ja.com

KitKatストレージアクセスフレームワークを使用した後、GoogleドライブのファイルコンテンツURIを開く

Android 4.4でストレージアクセスフレームワークを使用し、ファイルピッカーを開きます。

Googleドライブからファイルを選択する場合を除き、すべてが機能します。入力ストリームとして開く方法しかわかりませんが、Java Fileオブジェクトを取得したいと思います。

返されるコンテンツURIは、content://com.google.Android.apps.docs.storage/document/acc%3D4%3Bdoc%3D2279のようになります。

他の同様の質問ですが、ファイル名、ファイルサイズ、コンテンツを取得できる実用的なソリューションがありません:

Paul BurkeのFileChooser( https://github.com/iPaulPro/aFileChooser )も調べましたが、これは問題のリストで最も一般的な質問です。

そのコンテンツURIからファイルを取得するにはどうすればよいですか?

私の現在の回避策は、入力ストリームから一時ファイルを書き出すことです。

ありがとう!

23
Keith Entzeroth

OK。正しい方法は、contentresolverからのデータと一緒に他の投稿からの入力ストリームを使用することであることがわかりました。

参考のために、見つけるのが難しいAndroid docs: https://developer.Android.com/training/secure-file-sharing/retrieve-info.html

Mimetype、filename、filesizeを取得する関連コード:

Uri returnUri = returnIntent.getData();
String mimeType = getContentResolver().getType(returnUri);
Cursor returnCursor =
        getContentResolver().query(returnUri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
TextView nameView = (TextView) findViewById(R.id.filename_text);
TextView sizeView = (TextView) findViewById(R.id.filesize_text);
nameView.setText(returnCursor.getString(nameIndex));
sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));

ファイルの内容を取得するには:

getContentResolver().openInputStream(uri)

これが誰かの助けになることを願っています。

34
Keith Entzeroth

このコードは、Googleドライブから画像を選択しようとしたときに問題を解決しました、アプリがクラッシュしました、

 private void setImagePath(Intent data) throws Exception {

        String wholeID="";
        Uri selectedImage = data.getData();
        if(Build.VERSION.SDK_INT<=Build.VERSION_CODES.JELLY_BEAN_MR2){
            wholeID=getUriPreKitkat(selectedImage);
        }else  {
            wholeID = DocumentsContract.getDocumentId(selectedImage);

        }

        // Split at colon, use second item in the array
        Log.i("debug","uri google drive "+wholeID);
        String id = wholeID.split(":")[1];

        String[] column = {MediaStore.Images.Media.DATA};

        // where id is equal to
        String sel = MediaStore.Images.Media._ID + "=?";

        Cursor cursor = getActivity().getContentResolver().
                query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        column, sel, new String[]{id}, null);


        int columnIndex = cursor.getColumnIndex(column[0]);

        if (cursor.moveToFirst()) {
            filePath = cursor.getString(columnIndex);
        }
        cursor.close();

    }
0
Adeeb karim