1

Здравствуйте, я пытаюсь создать небольшое действие, в котором есть кнопка, два TextViews и ImageView. Упражнение должно отправить намерение для захвата фотографии и сохранения фото в кеше, когда нажата кнопка.Android: кнопка нажата, но метод не запустился

решаемые Ошибка тока можно найти в разделе EDIT:

Проблема в том, что, когда я нажал на кнопку, ничего не происходит. После добавления некоторых журналов я обнаружил, что проблема заключается в следующем методе:

private File createImageFile() throws IOException { 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = new File(this.getCacheDir(), "target"); 
    File image = File.createTempFile(
      imageFileName, 
      ".jpg", 
      storageDir 
    ); 

    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

Это является примером для сохранения изображения из разработчиков документации, но я изменил код здесь:

File storageDir = new File(this.getCacheDir(), "export"); 

Обход ошибки FileProvider.

Кто-нибудь знает, что не так с моим кодом?

EDIT: Для решения вышеуказанной ошибки перейдите по ссылке от Rahul. Теперь у меня возникает другая проблема с FileProvider.

решаемые см Ajith Pandians Ответ для решения

Logcat: 

    09-15 10:44:31.551 14882-14882/org.artoolkit.ar.samples.NftSimple E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: org.artoolkit.ar.samples.NftSimple, PID: 14882 
    java.lang.IllegalArgumentException:Failed to find configured root that contains /data/data/org.artoolkit.ar.samples.NftSimple/cache/targets/JPEG_20160915_104431_363552678.jpg 
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678) 
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377) 
    at org.artoolkit.ar.samples.nftSimple.MenuActivity.dispatchTakePictureIntent(MenuActivity.java:72) 
    at org.artoolkit.ar.samples.nftSimple.MenuActivity.access$000(MenuActivity.java:27) 
    at org.artoolkit.ar.samples.nftSimple.MenuActivity$1.onClick(MenuActivity.java:46) 
    at android.view.View.performClick(View.java:4780) 
    at android.view.View$PerformClick.run(View.java:19866) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

и код, который использует поставщика файла:

private void dispatchTakePictureIntent() { 
    Log.i(TAG, "I try to use my Method"); 
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (cameraIntent.resolveActivity(getPackageManager()) != null) { 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      Log.i(TAG, "Error while creating the Image: " + ex.getMessage()); 
      ex.printStackTrace(); 
     } 
     if(photoFile != null) { 
      Uri photoURI = FileProvider.getUriForFile(this, 
        "org.artoolkit.ar.samples.nftSimple.fileprovider", 
        photoFile); 
      cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(cameraIntent, CAMERA_REQUEST); 
     } 
    } 
} 

file_paths.xml:

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<cache-path name="my_images" path="Android/data/org.artoolkit.ar.samples.nftSimple/files/Pictures" /> 
</paths> 

поставщика в манифесте :

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="org.artoolkit.ar.samples.nftSimple.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/file_paths"></meta-data> 
    </provider> 
+0

Не могли бы вы разместить весь журнал ошибок, который вы получите при вызове этого метода? – Aenadon

+0

@Aenadon Полностью забыл об этом. Спасибо, что упомянули об этом! –

ответ

1

Я нашел проблему на file_paths.xml файл.

По документу

<cache-path name="name" path="path" /> 
    "Represents files in the cache subdirectory of your app's internal storage area. 
    The root path of this subdirectory is the same as the value returned by getCacheDir()". 

означает, что он будет возвращать "/data/org.artoolkit.ar.samples.nftSimple/cache/".

Вам просто нужно предоставить подкаталоги, например "pictures /", чтобы получить "Android/data/org.artoolkit.ar.samples.nftSimple/cache/pictures /".

Ваш file_paths.xml хотел это

<cache-path name="my_images" path="target/" /> 

Я надеюсь, что это поможет.

+0

Спасибо, но это то, что Рахул упомянул в своем ответе через ссылку –

+0

см. мой отредактированный ответ и дайте мне знать результат. @ Vincentthe0ne –

+0

, который сработал для меня спасибо –

1

пытается добавить на следующем в вашем AndroidManifest

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

также возможное решение вашей проблемы заключается в следующем:

Error: open failed: ENOENT (No such file or directory)

+0

Спасибо, что упомянули об этом, но я уже получил его в своем манифесте. –

+0

Согласно документации на Android, вам не нужно разрешение на сохранение в кеш-каталог. -> «Приложения не требуют дополнительных разрешений для чтения или записи на возвращаемый путь [путь кэширования], поскольку этот путь находится в их собственном хранилище». – Aenadon

+0

Вы не используете Environment.DIRECTORY_PICTURES правильно. Это не папка сама по себе, вам нужно использовать ее как параметр для метода getExternalStoragePublicDirectory(). Отметьте здесь: [link] (http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory (java.lang.String)) –