2016-08-02 8 views
2

こんにちは、私は、次の目的使用してアンドロイドで任意のファイルを選んでいます:ファイルでuriパスが機能しないのはなぜですか?

 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
     intent.setType("*/*"); 
     startActivityForResult(intent, PICKFILE_REQUEST_CODE); 

を私はuri.getPath()メソッドを呼び出すことにより、ファイルのパスを取得していますまた、選んだファイル&のURIを取得しています。パスを取得した後、file = new File(new URI(filePath));を使用してファイルオブジェクトを作成していますが、私はを取得しています。なぜそうですか?どうすれば絶対パスを得ることができますか?インテント&を使用してファイルを選択する他の方法はありますか? (これは、ダウンロードからである)のようなアンドロイドデバッガURIオブジェクトで

は示しています。content://com.android.providers.downloads.documents/document/67

& uri.getPath()が、それは常にURIではありませんつまりfile://異なりスキームを有していてもよいくれ

+0

あなたは画像を選んでいますか? –

+0

'Log.d'は' filePath'の値です、なぜあなたは 'File(URI)' ctorを使っていますか? – pskink

+0

Sohail Zahid私は指定されたMIMEタイプのファイルを選んでいません。@ pskink plzは編集された質問を参照してください。 – pcj

答えて

2

返さUri/document/67を与えますローカルファイルまたはすべてのデバイスアプリで利用可能なファイルに保存されます。例えば。それはcontent:// URIであり、そのパスはローカルファイルシステムのパスと共通していません。それを回避する公正な方法 - スキームがfile://であるかどうかをテストし、そうでない場合は - InputStreamからcontext.getContentResolver().openInputStream(uri)を開き、コンテンツをローカルの一時ファイルにコピーします。

+0

デバッガで私はスキームを内容として参照しています:// – pcj

+0

これはローカルファイルへのパスとしてURIパスを使用できない理由です。このパスは 'ContentProvider'のコンテキストでのみ意味を持つ抽象エンティティです。このURIを生成した回答に記載されている回避策を使用することができます。 – Sergio

+0

あなたはschemeがコンテンツの場合は、これを行う必要があることを示唆しています---> "context.getContentResolver()。openInputStream(uri)でInputStreamを開き、コンテンツをローカルの一時ファイルにコピーします。 ? – pcj

関連する問題