2017-03-06 11 views
0

私は写真を撮るアプリを持っています。私は最近、意図的にURIを渡すことができなくなったため、このアプリの一部を変更しなければなりませんでした。だから私は

file_uri = Uri.fromFile(file);

から

file_uri = FileProvider.getUriForFile(PhotoActivity.this,BuildConfig.APPLICATION_ID + ".provider", file);

に私のコードの一部を変更しかし、今、これは私のコードの別の部分が壊れているようだと私はそれを修正する方法を見つけ出す傾けます。ストリームをデコードできません:java.io.FileNotFoundException:

これは、関連する部品である:

private class Encode_image extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... voids) { 

     bitmap = BitmapFactory.decodeFile(file_uri.getPath()); 

     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
     bitmap.recycle(); 

     byte[] array = stream.toByteArray(); 
     encoded_string = Base64.encodeToString(array, 0); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     makeRequest(); 
    } 
} 
private void makeRequest() { 

    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    StringRequest request = new StringRequest(Request.Method.POST, POST_URL, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      HashMap<String,String> map = new HashMap<>(); 
      map.put("encoded_string",encoded_string); 
      map.put("image_name",image_name); 

      return map; 
     } 
    }; 
    requestQueue.add(request); 
} 

private void getFileUri() { 

    String uuid = UUID.randomUUID().toString(); 
    imageName=uuid; 

    image_name = uuid + ".jpg"; 
    file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 
      + File.separator + image_name 
    ); 

    //file_uri = Uri.fromFile(file); 
    file_uri = FileProvider.getUriForFile(PhotoActivity.this, 
      BuildConfig.APPLICATION_ID + ".provider", 
      file); 
} 

、これは私が取得していますエラーです:いただきましたそれと間違って

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /external_files/Pictures/aba094a2-3f15-405f-9203-fdc4245dc003.jpg (No such file or directory) 
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
                       Process: com.example.gabrieluliano.my_sick_app, PID: 8639 
                       java.lang.RuntimeException: An error occurred while executing doInBackground() 
                        at android.os.AsyncTask$3.done(AsyncTask.java:318) 
                        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
                        at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
                        at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                        at java.lang.Thread.run(Thread.java:762) 
                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference 
                        at com.example.gabrieluliano.my_sick_app.PhotoActivity$Encode_image.doInBackground(PhotoActivity.java:347) 
                        at com.example.gabrieluliano.my_sick_app.PhotoActivity$Encode_image.doInBackground(PhotoActivity.java:331) 
                        at android.os.AsyncTask$2.call(AsyncTask.java:304) 
                        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)  
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)  
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)  
                        at java.lang.Thread.run(Thread.java:762)  

誰もが知っていますか?おかげ

編集: 私は、ビットマップの一部を変更:

try(InputStream is = new URL(file_uri.getPath()).openStream()){ 
     bitmap = BitmapFactory.decodeStream(is); 

     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
     bitmap.recycle(); 

     byte[] array = stream.toByteArray(); 
     encoded_string = Base64.encodeToString(array, 0); 
     return null; 
     } 
     catch(Exception e){ 
      return null; 
     } 
+0

ファイルまたはディレクトリが存在するかどうか確認してください.... '/external_files/Pictures/aba094a2-3f15-405f-9203-fdc4245dc003.jpg(そのようなファイルまたはディレクトリはありません) ' – Dayan

+0

このディレクトリは、電話機のデフォルト画像ディレクトリです。新たに撮影した画像の名前 – Gabriel

答えて

0
bitmap = BitmapFactory.decodeFile(file_uri.getPath()); 

bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(file_uri)); 

に変更しかし、もちろん、最初のファイルからビットマップを作るために良いではありません。

もちろん、ビットマップとビットマップファクトリーを混乱させることなく、「そのまま」ファイルをアップロードする必要があります。

+0

ありがとう、私はちょうど私のバックエンドに画像のbase64表現を送信したいので、私はそれを使用しています – Gabriel

0

ではなくBitmapFactory.decodeFileよりBitmapFactory.decodeStreamを使用してみてください。

Hereは、その使用方法の例です。

+0

アプリがクラッシュするのを止めましたが、今はこれを取得しています – Gabriel

+0

E/Volley:[103] NetworkDispatcher.run:未処理の例外java.lang.NullPointerException:仮想メソッド 'int java.lang NULLオブジェクト参照でのString.length() ' java.lang.NullPointerException:ヌルオブジェクトリファレンス – Gabriel

+0

で仮想メソッド' int java.lang.String.length() 'を呼び出そうとしましたが、 AsyncTaskを使用すると、StackOverflow内で同様の問題を調べることをお勧めします。 –

関連する問題