2016-09-15 4 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

私はそれを正確に文書化しました。あなたが解決策を見つける手伝いをしてくれますか?

ありがとうございました!

+0

'//ファイルが正常に作成された場合にのみ続行します。いいえ、すでにファイルを作成しないでください。ファイル名を作成してそのURLを取得してください。 – greenapps

答えて

2

ステップ#1:(2016年9月15日のよう24.2.1)サポートライブラリの最新バージョンへの切り替え

ステップ#2:

<?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> 

、あなたが持っているかどうかを確認:あなたのfile_paths.xmlへの変更より良い運。

+0

サポートライブラリを変更するにはどうすればよいですか? – user3159043

+0

@ user3159043:Android Studioでは、[プロジェクトのプロパティ]ダイアログを使用するか、モジュールの 'build.gradle'ファイルを編集してください。 – CommonsWare

+0

残念ながら私はまだ同じエラーが発生しています:(私のやり方はありますか?私のアプリのためだけに画像を保存する必要があります。画像を保存するとdbデータも保存されます – user3159043

0

ピクチャパスはスラッシュで終わる必要があります。

アンドロイド/データ/ br.com.rfcgraciano.fotodata /ファイル/写真KO アンドロイド/データ/ br.com.rfcgraciano.fotodata /ファイル/写真/ OK

それがうまくいくなら、私を知ってみましょう。

関連する問題