2016-09-15 41 views
1

我正在做一個應用程序,我需要拍攝一張照片然後在數據庫上保存一些數據,但是當我嘗試獲取URI時出現此錯誤從照片:getUriForFile()拋出無法找到包含的配置根

java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/br.com.xxxxx.fotoaula/files/Pictures/JPEG_20160915_161210_-695228406.jpg 

這裏是我的代碼

package br.com.xxxxx.fotoaula; 

import android.Manifest; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Environment; 
import android.preference.PreferenceManager; 
import android.provider.MediaStore; 
import android.support.annotation.NonNull; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.content.FileProvider; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.Toast; 

import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class PicturesActivity extends AppCompatActivity { 

    private static final String TAG = "PicturesActivity"; 
    private static final int REQUEST_IMAGE_CAPTURE = 1; 
    private FloatingActionButton fabNewPicture; 
    private String mCurrentPhotoPath; 
    private ImageView imageView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_pictures); 

     imageView = (ImageView)findViewById(R.id.imageView); 
     fabNewPicture = (FloatingActionButton)findViewById(R.id.fab_new_picture); 
     fabNewPicture.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) { 
       dispatchTakePictureIntent(); 
      } 
     }); 
    } 

    private File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = "JPEG_" + timeStamp + "_"; 
     File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile(
       imageFileName, /* prefix */ 
       ".jpg",   /* suffix */ 
       storageDir  /* directory */ 
     ); 

     // Save a file: path for use with ACTION_VIEW intents 
     mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
     return image; 
    } 

    private void dispatchTakePictureIntent() 
    { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     // Ensure that there's a camera activity to handle the intent 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      // Create the File where the photo should go 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException ex) { 
       Toast.makeText(getApplicationContext(), "Erro ao salvar imagem!", Toast.LENGTH_SHORT).show(); 
      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       Uri photoURI = FileProvider.getUriForFile(this, 
         "br.com.xxxxx.fotoaula.fileprovider", 
         photoFile); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
       startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
      } 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
      Toast.makeText(this, "Imagem capturada com sucesso, salvar dados no BD", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

我的供應商:

<provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="br.com.xxxxx.fotoaula.fileprovider" 
      android:exported="false" 
      android:grantUriPermissions="true"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/file_paths"></meta-data> 
     </provider> 

而且我file_paths.xml

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="my_images" path="Android/data/br.com.xxxxx.fotodata/files/Pictures" /> 
</paths> 

我完全按照文檔做的那樣,你們能幫我找到解決辦法嗎?

非常感謝!

+0

'//僅當成功創建文件時繼續。不,不要創建文件。只需要創建一個文件名並採用其中的URI。 – greenapps

回答

2

第1步:切換到支持庫的最新版本(24.2.1 2016 9月15日)

第2步:改變你的file_paths.xml到:

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-files-path name="my_images" path="Pictures" /> 
</paths> 

,看看是否有祝你好運。

+0

我如何更改支持庫? – user3159043

+0

@ user3159043:在Android Studio中,使用「項目屬性」對話框或編輯模塊的'build.gradle'文件。 – CommonsWare

+0

不幸的是,我仍然有同樣的錯誤:(,有沒有辦法我可以做到這一點?我只需要保存圖片只爲我的應用程序,當我保存圖片,我也會保存一些數據庫數據 – user3159043

0

圖片路徑應該用斜槓結束。

的Android /數據/ br.com.rfcgraciano.fotodata /文件/圖片KO 的Android /數據/ br.com.rfcgraciano.fotodata /文件/圖片/ OK

讓我知道這是否會制定出。

相關問題