2017-02-16 18 views
0

Я пытаюсь сфотографировать, и я продолжаю получать исключение IllegalArgumentException с ошибкой Не удалось найти настроенный корень. Что это значит и как я могу это исправить?Android Съемка фотографий Просто java.lang.IllegalArgumentException: Не удалось найти настроенный корень

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.fileprovidertest, PID: 3841 
        java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.example.fileprovidertest/files/JPEG_20170215_202539_1361683671.jpg 
        at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711) 
        at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400) 
        at com.example.fileprovidertest.MainActivity.dispatchTakePictureIntent(MainActivity.java:126) 
        at com.example.fileprovidertest.MainActivity.onOptionsItemSelected(MainActivity.java:76) 
        at android.app.Activity.onMenuItemSelected(Activity.java:3204) 
        at com.android.internal.policy.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1215) 
        at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761) 
        at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152) 
        at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904) 
        at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894) 
        at android.widget.ActionMenuView.invokeItem(ActionMenuView.java:616) 
        at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:152) 
        at android.view.View.performClick(View.java:5637) 
        at android.view.View$PerformClick.run(View.java:22429) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

Исключение происходит в этой функции:

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) { 
      // Error occurred while creating the File 
      Toast.makeText(this, "File could not be created", 
        Toast.LENGTH_SHORT).show(); 
      ex.printStackTrace(); 
     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      Uri photoURI = FileProvider.getUriForFile(this, 
        "com.example.fileprovidertest.fileprovider", 
        photoFile); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
     } 
    } 
} 

Ошибка возникает в этой строке:

 Uri photoURI = FileProvider.getUriForFile(this, 
       "com.example.fileprovidertest.fileprovider", 
       photoFile); 

Вот функция, где photoFile устанавливается:

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 storageDir = new File(getBaseContext().getCacheDir(), Environment.DIRECTORY_PICTURES); 
    // File storageDir = Environment.getExternalStorageDirectory(); 
    File storageDir = getFilesDir(); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

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

Вот мой Android Manifest.xml:

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

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

      <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.example.fileprovidertest.fileprovider" 
      android:grantUriPermissions="true" 
      android:exported="false"> 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/filepaths" /> 
     </provider> 
    </application> 

    <uses-feature android:name="android.hardware.camera" 
     android:required="true" /> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

</manifest> 

Вот мой filepaths.xml:

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

Я думаю, что нужно изменить путь в моих путях файлов, но я не уверен, что изменить его.

ответ

0

Согласно Android documentation, при добавлении filepaths.xml:

Убедитесь, что вы замените com.example.package.name с фактическим именем пакета приложения.

И если вы посмотрите на ошибку, это говорит вам, что по какой-то причине не удается написать следующее местоположение /data/data/com.example.fileprovidertest/files/....

Поскольку вы предоставили путь com.example.fileprovidertest.fileprovider как в вашей AndroidManifest и деятельности, я подозреваю, что ваш .xml должен следовать набор:

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

 Смежные вопросы

  • Нет связанных вопросов^_^