2016-11-24 24 views
0

私のアプリでは、外部のカメラアクティビティをデータ収集の一部として使用し、その結果のファイルパスのUri.toString()をモデルに保存して後で使用できます。Android:ファイルをuriまたはファイルパスでデコードするときにファイルが見つかりません

後でコレクションをリサイクラビューで表示すると、読み込まれた画像のサイズが原因でアプリケーションが遅くなるため、Googleのソリューションhereを実装しましたが、スタックトレースにFileNotFoundExceptionsが表示され、 tローディング。残りのビューはうまくロードされ、アプリケーションはクラッシュしません。

前述したように、uriStringは、content:foo/barという形式の文字列です。私は含むソリューションを試みました。

  • uri.toStringの代わりにfile.getabsolutePath()をモデルに格納します。これはfile:/foo/barにuriString形式を変更し、まだuriStringから新しいFileオブジェクトを作成し、getAbsolutePath()を呼び出し、それからgetPath()Uri.parse(uriString).getPath()
  • を呼び出す
  • を動作しません。

明確にするには、imageView.setImageURI(Uri.parse(this.item.getPhotoURI()));を呼び出してください。したがってファイルが存在し、uriStringはAndroidによって解釈されます。問題の機能は以下の通りです。私のスタックトレースは下にあります。

private Bitmap decodeSampledBitmapFromFile(String uriString, int reqWidth, int reqHeight) 
    { 

     // First we do this just to check dimensions (apparently) 
     final BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inJustDecodeBounds = true; 


     BitmapFactory.decodeFile(uriString, options); 

     // Calculate inSampleSize 
     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

     // And then return with inSampleSize set 
     options.inJustDecodeBounds = false; 

     return BitmapFactory.decodeFile(uriString, options); 

    } 

そして、私のスタックトレース:FOO /バー:

11-24 16:10:57.762 17199-17199/uk.mrshll.matt.accountabilityscrapbook E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/Android/data/uk.mrshll.matt.accountabilityscrapbook/files/Pictures/JPEG_20161124_160913_-1155698030.jpg: open failed: ENOENT (No such file or directory) 
+0

を使用してください。ファイル名が問題になることがあります。 JPEG_20161124_160913_-1155698030.jpg 11556 ... 0の開始前にダッシュが付いていることを確認し、ファイル名のどこにでもダッシュを使用しないようにしてください。 – MikeOscarEcho

答えて

0

述べたように、uriStringは、コンテンツのフォーマットの文字列です。

あなたの誤りによると、あなたのエラーは、"file:/storage/emulated/0/Android/data/uk.mrshll.matt.accountabilityscrapbook/files/Pictures/JPEG_20161124_160913_-1155698030.jpg"decodeFile()に渡そうとしていることを示しています。その文字列に表されたスキームはfileであり、contentではありません。さらに重要なことは、decodeFile()Uri(またはUriの文字列表現)ではなく、ファイルパスであり、ファイルパスにはスキームがないことです。

あなたはcontentfileスキームの一部混在持つように期待している場合:Uri

  • ホールドを(文字列のうちか、最悪の場合、再解析Uri
  • 使用ContentResolverそしてopenInputStream()
  • openInputStream()は両方contentfileスキームをサポートしているとして)Uriに代表されるコンテンツのInputStreamを取得しますdecodeStream()の代わりにdecodeFile()
+0

申し訳ありません。それは私のポストで言及したように、私はurlStringがどのように作成されたかを交換しようとしました。あなたのアドバイスを試みるContentResolver – Mrshll1001

関連する問題