2016-11-08 14 views
2

を含む構成済みのルートを見つけることができませんでした。私が試しているApp用にカメラで撮影した画像を保存しようとしているときにエラーが発生しました。開発する。エラーがjava.lang.IllegalArgumentException:/ storage/emulated/0/Pictures/

java.lang.IllegalArgumentExceptionがある:/ストレージが含まれて構成されたルートを見つけることができませんでした/ラインFileProvider.getUriForFileで私のコードでは、このメソッドに/ 0 /写真/ JPEG20161108_153704_

にlogcatポイントをエミュレート

private File createImageFile() throws IOException { 
     /* Create an image file name */ 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); 
     String imageFileName = "JPEG" + timeStamp + "_"; 
     File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsoluteFile(), imageFileName); 
     File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 

     /* Tried this also, not working. Leaving for debugging. 
     File image = File.createTempFile(
       imageFileName, 
       ".jpg", 
       storageDir 
     );*/ 

     File image = new File(path, imageFileName); 
     try { 
      /* Making sure the Pictures directory exist.*/ 
      path.mkdir(); 
      storageDir.createNewFile(); 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 

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

このメソッドは、イメージファイルを作成するために使用される。..

private void dispatchTakePhoto() { 
     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivity(takePictureIntent); // this worked originally 
     if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
      File photoFile = null; 
      try { 
       photoFile = createImageFile(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       Log.e(TAG, ""+e); 
      } 
      if (photoFile != null) { 
       Uri photoURI = FileProvider.getUriForFile(TallyActivity2.this, 
         "com.example.bigdaddy.pipelinepipetally.fileprovider", photoFile); 
       takePictureIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
       startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
      } 
     } 
    } 

と呼ばれている。ここですメソッドでは、キャプチャした画像をsaveImage()メソッドで保存し、サムネイルをImageViewに設定したいと考えています。 saveImage()メソッドはバイトを返すので、ユーザーがサムネイルImageViewをクリックすると、そのバンドをインテントから別のフルスクリーンアクティビティに渡すことができます。ここで

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     /* If it's equal to my REQUEST_IMAGE_CAPTURE var, we are all good. */ 
     if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
      Bundle extras = data.getExtras(); 
      Bitmap imageBitmap = (Bitmap) extras.get("data"); 
      /*Saving to the Pipe class with the saveImage() method below.*/ 
      sDummyImagePicByte = saveImage(imageBitmap); 
      /* Going ahead an setting the thumbnail here for the picture taken*/ 
      mPipePicImage.setImageBitmap(imageBitmap); 
      Log.i(TAG,Arrays.toString(sDummyImagePicByte)+" after assignment from saveImage()"); 
     } 
    } 

ここManifest.xmlファイル

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      package="com.example.bigdaddy.pipelinepipetally"> 

    <uses-permission android:name="android.permission.READ_CONTACTS"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
     android:maxSdkVersion="18"/> 
    <uses-permission android:name="android.permission.CAMERA"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/> 

    <application 
     android:allowBackup="true" 
     android:debuggable="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" 
     tools:ignore="HardcodedDebugMode"> 
     <activity 
      android:name=".MainActivity" 
      android:windowSoftInputMode="adjustResize"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 

       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".TallyActivity2" 
      android:windowSoftInputMode="adjustResize"> 
     </activity> 
     <activity 
      android:name=".JobAndDbActivity" 
      android:windowSoftInputMode="adjustResize"> 
     </activity> 
     <activity 
      android:name=".ExistingTallyActivity" 
      android:windowSoftInputMode="adjustResize"> 
     </activity> 
     <activity android:name=".ImageToFullscreen" 
      android:windowSoftInputMode="adjustResize"> 
     </activity> 

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

    </application> 
</manifest> 

は(私も作成した)私が作成したfile_paths.xmlファイルで、アプリケーション/ resを/ XML /フォルダに置かれています。これが正しい場所(フォルダの場合)であるかどうかは不明です。

<paths > 
    <files-path name="my_images" path="files/"/> 
    ... 
</paths> 

また、これは私が必ずこの上の任意の助けに感謝onRequestPermissionsResult()

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], 
              @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case MY_PERMISSIONS_REQUEST_CAMERA: 
       /* if request is canceled, the result arrays are empty */ 
       if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        /* Permissions granted so the mPermissionIsGranted boolean is set to true*/ 
        mPermissionIsGranted = true; 
       } else { 
        /* 
        Permissions denied so the mPermissionIsGranted boolean stays false here and 
        providing a Toast message to the user, letting them know that camera permissions 
        are required for this feature. 
        */ 
        Toast.makeText(getApplicationContext(),"Camera permissions required\nfor this" + 
            "feature.", 
          Toast.LENGTH_LONG).show(); 
        /* Continuing to hold the false setting to this boolean since not granted.*/ 
        mPermissionIsGranted = false; 
       } 
       break; 
      /* For accessing and writing to the SD card*/ 
      case MY_PERMISSIONS_REQUEST_SD_CARD: 
       /* if request is canceled, the result arrays are empty */ 
       if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        /* Permissions granted so the mPermissionIsGranted boolean is set to true*/ 
        mPermissionIsGranted = true; 
       } else { 
        /* 
        Permissions denied so the mPermissionIsGranted boolean stays false here and 
        providing a Toast message to the user, letting them know that camera permissions 
        are required for this feature. 
        */ 
        Toast.makeText(getApplicationContext(),"SD Card permissions required\nfor this"+ 
            "feature.", 
          Toast.LENGTH_LONG).show(); 
        /* Continuing to hold the false setting to this boolean since not granted.*/ 
        mPermissionIsGranted = false; 
       } 
       break; 
      /* For the GPS location permissions.*/ 
      default: MY_PERMISSIONS_REQUEST_FINE_LOCATION: 
      /* Still to be implemented .*/ 
       break; 
     } 
    } 

です。私はまだ新しいAndroidを学んでいます。前もって感謝します。

答えて

5
<files-path name="my_images" path="files/"/> 

これはgetFilesDir()の内部files/ディレクトリを指しています。しかし、それはcreateImageFile()がファイルを配置する場所ではありません。代わりに、Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)を使用しています。以下を行う必要があります。

  1. 、その後、正しいものである場所を決定します(またはそれらのいずれよりも別のオプションを選択してください)
  2. 実装少し遅れて

+0

お返事ありがとうございます。したがって、XMLファイル内のファイルパスは内部ファイルストレージを指していますか? – J2112O

+0

@ J2112O:正しい。 [ドキュメント](https://developer.android.com/reference/android/support/v4/content/FileProvider.html#SpecifyFiles)を参照してください。 – CommonsWare

+0

こんにちは@CommonsWareので、@ J2112Oは '<ファイルパス名=" my_images "path ="ファイル/ "/>'を<外部パス名= "my_images"のパス= "ファイル/"/? _files/_パスは正しいですか?何かを変えるには? – Jaco

7

そのを同期...しかし、私はついに解決することができました。

documentationを1として:そう

getExternalFilesDir(Environment.DIRECTORY_PICTURES)

代わりの

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 

を使用して、あなたのパスは、このようにする必要がありThe path component only corresponds to the path that is returned by getExternalFilesDir() when called with Environment.DIRECTORY_PICTURES.

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <external-path name="InstructiveRide" path="Android/data/com.package.ride/files/Pictures"/> 
</paths> 

とし、Pictureディレクトリの下にサブディレクトリがある場合はこれを書いてください。

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <external-path name="InstructiveRide" path="Android/data/com.package.ride/files/Pictures/InstructiveRide/"/> 
</paths> 
関連する問題