1

Bonjour J'essaye de créer une petite activité qui a un bouton, deux TextViews et un ImageView. L'activité devrait envoyer une intention de capturer une photo et d'enregistrer la photo dans le cache, lorsque le bouton a été cliqué.Android: le bouton a cliqué mais la méthode n'a pas commencé

SOLVED erreur en cours se trouvent sous EDIT:

Le problème est que quand je frappe le bouton, rien ne se passe. Après avoir ajouté quelques journaux que j'ai découvert que le problème est dans la méthode suivante:

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; 
} 

Il est l'exemple pour l'enregistrement d'une image de la documentation développeur, mais j'ai changé le code ici:

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

Pour contourner l'erreur FileProvider.

Est-ce que quelqu'un sait quel est le problème avec mon code?

EDIT: Pour la solution de l'erreur ci-dessus, suivez le lien de Rahul. Maintenant, je reçois un autre problème avec FileProvider.

SOLVED voir Ajith Pandians réponse pour la solution

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) 

et le code qui utilise le fournisseur du fichier:

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> 

Fournisseur de Manifest :

<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

Pouvez-vous s'il vous plaît publier l'ensemble du journal des erreurs que vous obtenez lorsque cette méthode est appelée? – Aenadon

+0

@Aenadon a complètement oublié cela. Merci de le mentionner! –

Répondre

1

Je trouve le problème sur le fichier file_paths.xml.

Par le document

<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()". 

signifie qu'il retournera "/data/org.artoolkit.ar.samples.nftSimple/cache/".

Vous avez juste besoin de donner comme "images sous-dossier /" pour obtenir "Android/data/org.artoolkit.ar.samples.nftSimple/cache/images /".

Votre file_paths.xml doit aimer ce

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

J'espère que cela vous aidera.

+0

Merci, mais c'est aussi ce que Rahul a mentionné dans sa réponse via le lien –

+0

voir ma réponse éditée et laissez-moi savoir le résultat. @ Vincentthe0ne –

+0

qui a travaillé pour moi merci –

1

essayer d'ajouter le folowing dans votre AndroidManifest

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

également solution pour votre problème est le suivant:

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

+0

Merci d'avoir mentionné cela, mais je l'ai déjà dans mon manifeste. –

+0

Selon la documentation Android, vous n'avez pas besoin d'autorisation pour enregistrer dans le répertoire de cache. -> "Les applications ne requièrent aucune autorisation supplémentaire pour lire ou écrire sur le chemin renvoyé [le chemin du cache], car ce chemin d'accès réside dans leur stockage privé." – Aenadon

+0

Vous n'utilisez pas Environment.DIRECTORY_PICTURES correctement. Ce n'est pas un dossier en soi, vous devez l'utiliser comme paramètre pour la méthode getExternalStoragePublicDirectory(). Cochez ici: [link] (http://developer.android.com/reference/android/os/Environment.html#getExternalStoragePublicDirectory (java.lang.String)) –