IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Intent MediaStore (capture de photo), sauvegarde photo (permission denied et nom/emplacement photo)


Sujet :

Android

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut Intent MediaStore (capture de photo), sauvegarde photo (permission denied et nom/emplacement photo)
    Bonjour tout l'monde =)

    J'utilise le provider MediaStore afin de faire prendre une photo par l'utilisateur de mon appli, et sauvegarder cette dernière pour être réutilisée plus tard dans le même programme.

    Je rencontre deux difficultés :
    1 ) Je n'arrive pas à stocker la photo ("permission denierd' sur le logcat). Pourtant j'ai bien la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <uses-permission android:name="android.permision.WRITE_EXTERNAL_STORAGE" />
    dans mon AndroidManifest.xml...

    2 ) Lorsque la photo est prise, dîtes moi si je me trompe, mais cette dernière est automatiquement stockée dans le tel avant même l'appel de la méthode onActivityResult ? Je demande cela car la photo est visible dans la galerie photo de mon Android (donc pas dans l'emplacement prévu) et avec un nom généré automatiquement (alors que je souhaite aussi donner un nom à cette photo). J'ai beau cherché, pas moyen de trouver le moyen d'éviter cette 'sauvegarde' automatique.. Le but et juste de stocker la photo avec un nom retrouvable dans la suite du programme sans être obligé de la sauvegarder à deux endroits différents (histoire de bouffer le moins d'espace possible..)

    Voici mon code, j'ai commenté les parties qui me posent problèmes et mes tests/recherches avant de venir poster ici :

    AndroidManifest.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <?xml version="1.0" encoding="utf-8"?>
    ...
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.CAMERA" />
        <uses-permission android:name="android.permision.WRITE_EXTERNAL_STORAGE" />
     
        <uses-feature android:name="android.hardware.camera.autofocus" />
        <uses-feature android:name="android.hardware.camera" />
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                ...
            </activity>
            <activity android:name=".Arbre" >
            </activity>
    ...
    Slide_arbre.java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    public class Slide_arbre extends Fragment {
    	...
    	public View onCreateView(LayoutInflater inflater, ViewGroup container,
    			Bundle savedInstanceState) {
    		ViewGroup root = (ViewGroup) inflater.inflate(R.layout.slide_arbre,
    				null);
    		...
    		photo.setOnClickListener(new OnClickListener() {
    			public void onClick(View arg0) {
    				Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                                    //j'ai essayé d'utiliser EXTRA_OUTPUT pour donner le nom et/ou le chemin d'accès, mais sans succé...
    				// intent.putExtra(MediaStore.EXTRA_OUTPUT, "photo");
    				// "click path :"+Environment.getExternalStorageDirectory()+"plop.jpg");
    				getActivity().startActivityForResult(intent, 1111);
    			}
    		});
    		return root;
    	}
    }
    Arbre.java : (activité principale)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    public class Arbre extends FragmentActivity {
        ...
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
        	Log.i("Arbre", "ICI");
        	Log.i("requestcode", String.valueOf(requestCode));
        	if (requestCode == 1111) { //je rentre bien ici
                Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
                File file = new File(Environment.getExternalStorageDirectory()+File.separator+ "tralala.jpg");
                Log.i("path", Environment.getExternalStorageDirectory()+File.separator + "tralala.jpg");
                    //affiche : mnt/sdcard/tralala.jpg
                Log.i("file", file.toString());
                    // affiche la même chose
                try { //je rentre bien ici aussi d'après des log
                    file.createNewFile(); //la permission denied du logcat pointe ici
                    FileOutputStream fo = new FileOutputStream(file);
                    //ptit test ci dessous, mais permission denied egalement
                    //FileOutputStream fo = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+File.separator+"test.jpg"));
                    fo.write(bytes.toByteArray());
                    fo.close();
                } catch (IOException e) {
                    ...
                }
            }
        }
    }
    Merci pour un peu d'aide

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Peut être une mauvaise utilisation de File....
    Le passage d'un File (comme getExternalStorageDirectory()) à un "enfant" se fait simplement par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File child = new File(parent,"tralala.jpg");
    (référence)
    et surtout pas par une concaténation hasardeuse de chaînes.

    Sinon, rien ne dit que:
    getExternalStorageDirectory() existe....
    De plus:
    Applications should not directly use this top-level directory, in order to avoid polluting the user's root namespace.

    Le fichier est "privé" à l'application ? (si l'application est désinstallée il doit être supprimé ?) ou non ?

    Si oui, il faut utiliser getExternalFilesDir() du context...
    Si non, il faut utiliser getExternalStorageDirectory() de l'environnement, avec un sous directory (le nom du package par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File extDir = new File(Environment.getExternalStorageDirectory(),context.getPackageName());
    extDir.mkdirs();
    File outFile = new File(extDir,"tralala.jpg");
    Dans le deux cas, il faut vérifier avant l'état du external storage avec:
    Environment.getExternalStorageState();

    createNewFile() ne sert à rien.... il sert juste à vérifier de manière atomique qu'un fichier n'existe pas encore, de le créer et de retourner "true" si c'est bien le cas (deux threads ne peuvent ainsi pas avoir 'true' retourné tous-deux sur le même fichier).
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    Merci pour ta réponse

    J'ai testé si la valeur de getExternalStorageDirectory existait (via un logcat), et j'ai obtenu ceci : (ligne 12/13 de Arbre.java)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Log.i("path", Environment.getExternalStorageDirectory()+File.separator + "tralala.jpg");
                    //affiche : mnt/sdcard/tralala.jpg
    Je ne sais pas si tu l'as vu dans mon code plus haut, ou si ça ne veux pas forcement dire que cette variable existe (ce qui m'étonnerai fort, mais sait on jamais ^^)

    J'ai testé avec ton code du coup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    File extDir=new File(Environment.getExternalStorageDirectory(),getPackageName());
                extDir.mkdirs();
                File file = new File(extDir,"tralala.jpg");
                Log.i("extdir", extDir.toString()); //affiche : /mnt/sdcard/com.example.chiro
                Log.i("file", file.toString()); //affiche : /mnt/sdcard/com.example.chiro/tralala.jpg
                try {
                	Log.i("Arbre", "ICI3");
                    //file.createNewFile(); 
                    FileOutputStream fo = new FileOutputStream(file); //No such file or directory
    ...
    Mais permission refusé ..

    Que le fichier doivent être privé ou non à l'application n'est pas important pour moi pour le moment..
    Et en continuant à parcourir le net et la doc, il y a effectivement une save du fichier automatique avant d'entrer dans le onActivityResult..Il n'existe pas de moyen simple pour au moins connaitre le nom de l'image sauvegardé automatiquement ? parce qu'à la limite... si j'ai juste cette information , pas besoin de m'embéter à sauvegarder le fichier ailleur non?

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par kegilko Voir le message
    Je ne sais pas si tu l'as vu dans mon code plus haut, ou si ça ne veux pas forcement dire que cette variable existe (ce qui m'étonnerai fort, mais sait on jamais ^^)
    Je n'ai pas dit que ça pouvait ne pas exister (il existe toujours)... juste qu'il se pouvait que le chemin ne soit pas accessible tout le temps ! (connexion USB, etc...).

    Bon.... je vais essayer localement chez moi...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    Oula je t'ai dit des bétises ! avec ton bout de code, je n'ai pas droit à un "permission denied" , mais à un "no such file or directory" !

    Bon, perso je comprend encore moins x)
    La création du dossier qui a le nom de mon paquet n'est pas passé peut etre ?

    Je vais rechercher de ce coté la...
    Je ne sais pas si il peut y avoir un rapport ou pas, mais je travaille avec un téléphone non rooté.

    Merci de prendre du temps pour moi en tout cas

    edit : petite précision, pas de message particulier concernant le mkdir dans le logcat...à supposer qu'il devrait y en avoir un lorsque l'opération se passe mal

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    il manque le "mkdirs()"
    qui renvoit un boolean et c'est tout...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    il manque le mkdirs()..pour le file comme ça c'est ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    File extDir=new File(Environment.getExternalStorageDirectory(),getPackageName());
                extDir.mkdirs();
                File file = new File(extDir,"tralala.jpg");
                file.mkdirs();
    ...
    Si c'est ça, toujours un "no such file or directory" dans le logcat...

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    J'ai trouvé ton problème !

    Une typo dans permission
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <uses-permission android:name="android.permision.WRITE_EXTERNAL_STORAGE" />
    Utiliser l'éditeur de permissions aurait permis d'éviter cela
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    ouuUUUUU sacrébleu de bordel de nouilles ! toussa à cause de ça !!

    Merci boocoup Nicroman xD
    Avant de caller le sujet sur "résolue" je me permet de revenir sur la pseudo-deuxième problématique.. a savoir, y a t'il un moyen d'éviter la sauvegarde automatique dans la galerie de l'appareil (je n'ai pas trouvé en tout cas..). Et si non, j'imagine que je dois passer par les uri pour choper l'emplacement des photos de la galerie et à partir de la je pourrais supprimer le dernier ajout en cuisinant un peu ?

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Dans ce cas... utiliser simplement un ACTION_PICK sur une image...
    La galerie proposera alors de prendre une photo ... et on récupère juste l'URI finale du fichier.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 21
    Dernier message: 21/10/2013, 11h41
  2. Sauvegarde des permissions d'un site
    Par nico18987 dans le forum SharePoint
    Réponses: 3
    Dernier message: 18/01/2008, 15h56
  3. [Conception] stockage des (noms de) photos ?
    Par BlindeKinder dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2007, 01h53
  4. permission denied
    Par HULK dans le forum Apache
    Réponses: 2
    Dernier message: 08/04/2004, 19h46
  5. [PostgreSQL]permission denied
    Par alex2205 dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 13/02/2003, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo