2016-10-20 3 views
0

ビデオサムネイル用のビデオファイルのパスを取得しようとしています。ここでいくつかの解決策に基づいて修正した後もなぜそれがまだnullになっているのか分かりません。アンドロイドのバージョンは6.0.1です。メディアストアからのAndroidビデオファイルのパスがnullになる

ユーザはフローティングアクションボタンをクリックし、ビデオギャラリーを呼び出す。

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.addNote); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(); 
      intent.setType("video/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(Intent.createChooser(intent, "Select Video"), REQUEST_TAKE_GALLERY_VIDEO); 
     } 
    }); 

ユーザーがギャラリーから目的のビデオを選択すると、ビデオはソートされるアクティビティに移動します。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 

     Uri uri = data.getData(); 
     Log.d(TAG, "Uri: " + uri); 

     Log.d(TAG, "Uri authority: " + uri.getAuthority()); 

     String filemanagerstring = uri.getPath(); 
     Log.d(TAG, "filemanagerstring: " + filemanagerstring); 

     String selectedImagePath = getPath(uri); 
     Log.d(TAG, "selectedImagePath: " + selectedImagePath); 
    } 
} 

ビデオファイルのパスを取得する方法。

public String getPath(Uri uri) { 

    Cursor cursor = this.getContentResolver().query(uri, null, null, null, null); 
    int idx = 0; 

    //Source not from device capture or selection 
    if (cursor == null) { 
     return uri.getPath(); 
    } else { 
     cursor.moveToFirst(); 
     idx = cursor.getColumnIndex(MediaStore.Video.VideoColumns.DATA); 
     if (idx == -1) { 
      Log.d(TAG, "uri path: " + path); 
      return uri.getPath(); 
     } 
    } 
    String path = cursor.getString(idx); 
    Log.d(TAG, "path: " + path); 
    cursor.close(); 
    return path; 
} 

結果:私はnull(-1)を取得し、正しいパスではない、uriのパスを取得しました。ビデオファイルの完全なパスが必要です。

Uri: content://com.android.providers.media.documents/document/video%3A6174 
Uri authority: com.android.providers.media.documents 
filemanagerstring: /document/video:6174 
**uri path: 16842794** 
selectedImagePath: /document/video:6174 
+0

「私はフルを必要としますビデオファイルのパス " - いいえ、ビデオのサムネイルが必要です。ファイルシステムにアクセスできるファイルはもちろんのこと、ファイルがなくてもかまいませんので、「フルパス」である必要はありません。この「ウリ」はどこから来たのですか? – CommonsWare

+0

uriはUriから来ていますuri = data.getData(); onActivityResultに格納されます。ユーザーがギャラリーからビデオを選択します(これが知りたい場合)。迅速な返信をありがとう! – Meep

+0

この 'onActivityResult()'呼び出しをトリガーしている 'startActivityForResult()'呼び出しは何ですか? – CommonsWare

答えて

2

と召喚動画

のギャラリーいいえ、それはしていません。これにより、video/*のMIMEタイプに対してACTION_GET_CONTENTをサポートするすべてのアクティビティからユーザが選択できます。あなたが戻ったUriは、必ずしも「ギャラリー」アプリではなく、必ずしもファイルを指し示すものではなく、何でもよい。 Uriは指し示すことができます:

  • 外部ストレージ上のファイル、あなたは
  • 直接あなたには、いくつかの内部ストレージに
  • ファイルにアクセスすることはできませんリムーバブルストレージ上のファイルを、読むことができるかもしれないものを他のアプリ
  • データベース内BLOB列の内容はまだデバイス上に存在し、Tを必要としないオンザフライ
  • 何かを解読しなければならない
  • 何かO、
  • をダウンロードし、そう

    ビデオファイルのパスを取得する

    方法

にあなたがそのquery()から取り戻すことができる唯一の値は、確実に、OpenableColumnsあることコンテンツのサイズと「表示名」は

あなたがいずれかを行う必要があります。

  • は、いくつかを使用し、その後、コンテンツのInputStreamを取得するには、サムネイルを使用ContentResolverパラメータとしてcontentUri、または

  • を受け入れエンジンとopenInputStream()を使用しますをパラメータとして受け入れるサムネイルエンジン、または

  • ContentResolverおよびopenInputStream()を使用してコンテンツにInputStreamを取得し、そのストリームを使用してコンテンツのバイトのコピーを含む独自のファイルを作成します。ファイルが必要なサムネイルエンジンで独自のファイルを使用できます。

  • あなたはMediaStoreからこれらの動画のサムネイルを得ることができるよう、ACTION_GET_CONTENTを使用しますが、代わりにすべてのビデオのためのMediaStoreを尋ねることによって、独自の「チュー」UIをレンダリングしないでください(this sample appを参照)

+0

私はこの情報を消化する必要があります。これを事前に回答としてマークします。ありがとうございました。 – Meep

+0

この問題を解決する最も簡単な方法として、4番目のオプションを使用することに決めました。このソリューションは、私が取り組んでいたソリューションと比べて非常に単純です。 – Meep

関連する問題