2017-03-06 88 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)); 

但是,當然,這是不好使一個位圖出來的文件第一次。

您當然應該上傳文件'原樣',而不要搞亂Bitmaps和BitmapFactory。

+0

感謝這個作品,我使用它,因爲我只是想將圖像的base64表示形式發送到我的後端 – Gabriel

0

嘗試使用BitmapFactory.decodeStream而非BitmapFactory.decodeFile

Here是如何使用它的一個例子。

+0

它停止了應用程序崩潰,但現在我得到這個 – Gabriel

+0

E/Volley:[103] NetworkDispatcher.run:未處理的異常java.lang.NullPointerException:嘗試調用虛擬方法'int java.lang。 String.length()'null對象引用 java.lang.NullPointerException:嘗試在空對象引用 – Gabriel

+0

上調用虛擬方法'int java.lang.String.length()',這是解釋性的,但是,因爲你使用AsyncTask我建議你看看StackOverflow中的類似問題。 –