Autore Topic: Problema con getExternalStorageDirectory  (Letto 1118 volte)

Offline NXS

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus S
  • Sistema operativo:
    Windows 7
Problema con getExternalStorageDirectory
« il: 13 Marzo 2012, 18:38:17 CET »
0
Salve a tutti. Sto provando a sviluppare un'applicazione che implementa varie funzioni, tra cui quella di poter scattare una foto da riutilizzare successivamente in un'altra activity. Uso le API di android 2.1 (7) e il problema che Eclipse mi segnala è "DIRECTORY_PICTURES cannot be resolved as a type", nelle seguenti righe di codice che ho preso dai tutorial di google:

Codice (Java): [Seleziona]
File mediaStorageDir = new File(Environment.getExternalStorageDirectory(
              Environment.DIRECTORY_PICTURES), "MyCameraApp");

Ho letto che ci sono delle differenze nella gestione delle immagini fino a android 2.1 e dalla 2.2 in poi. Infatti da froyo in poi si dovrebbe utilizzare getExternalStoragePublicDirectory per far si che altre applicazioni possano accedere a determinate immagini scattate tramite questa applicazione. Allo stato attuale (togliendo "Environment.DIRECTORY_PICTURES" dalle parentesi) l'applicazione, una volta richiamata la fotocamera scatta correttamente la foto salvandola nella cartella che ho scelto ("MyCameraApp" nell'esempio di google) ma va in crash non appena clicco su ok.

Questo è il codice completo della classe che utilizza la fotocamera:

Codice (Java): [Seleziona]
package parking.reminder;


import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;



public class TakePhotoActivity extends Activity {
        private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
        private Uri fileUri;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.take_photo);

    // create Intent to take a picture and return control to the calling application
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Image captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }
}
public static final int MEDIA_TYPE_IMAGE = 1;


/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
      return Uri.fromFile(getOutputMediaFile(type));
}

/** Create a File for saving an image or video */
public static File getOutputMediaFile(int type){
        //Check that the sd card is mounted
        boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        String state = Environment.getExternalStorageState();

        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            mExternalStorageAvailable = mExternalStorageWriteable = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
        } else {
            // Something else is wrong. It may be one of many other states, but all we need
            //  to know is we can neither read nor write
            mExternalStorageAvailable = mExternalStorageWriteable = false;
        }
   
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory(
              Environment.DIRECTORY_PICTURES), "Parking Reminder");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("Parking Reminder", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".jpg");
    } else {
        return null;
    }

    return mediaFile;
}
}

Come risolvo il problema segnalato da Eclipse e che credo sia responsabile del crash dell'applicazione una volta che clicco sul tasto "ok" dopo aver scattato la foto?

Grazie mille a tutti coloro che si cimenteranno nel darmi una mano  :D

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Problema con getExternalStorageDirectory
« Risposta #1 il: 13 Marzo 2012, 19:55:11 CET »
0
se crasha,devi postare il logcat
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline NXS

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus S
  • Sistema operativo:
    Windows 7
Re:Problema con getExternalStorageDirectory
« Risposta #2 il: 14 Marzo 2012, 00:46:01 CET »
0
Hai ragione scusami. Rileggendo quello che ho scritto nel primo post ho notato di essermi espresso male oltretutto. Se lascio il parametro (Environment.DIRECTORY_PICTURES) nella chiamata Environment.getExternalPublicStorageDirectory, Eclipse non mi fa eseguire il programma, perché segnala un errore "DIRECTORY_PICTURES cannot be resolved as a type or field". Essendo che le API sono per android 2.1, oltretuttto devo per forza usare Environment.getExternalStorageDirectory senza "Public", perché è stato introdotta solo da froyo in poi questa possibilità. Posso eseguire l'applicazione solo se cambio il codice da così:

Codice (Java): [Seleziona]
File mediaStorageDir = new File(Environment.getExternalPublicStorageDirectory(Environment.DIRECTORY_PICTURES), "Parking Reminder");
a così:

Codice (Java): [Seleziona]
File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "Parking Reminder");
In questo modo riesco a eseguire il programma che chiama correttamente la fotocamera di sistema e che scatta una foto salvandola nella cartella "Parking Reminder", appunto. Ma quando si clicca l'ok sulla foto una volta scattata sempre dall'interfaccia della fotocamera di sistema, ovvero quando si dovrebbe passare la foto all'app, il programma crasha e credo sia normale visto che non è assegnato nessun parametro alla funzione che dovrebbe rendere "pubblica" la foto appena scattata . Il problema fondamentale è che io dovrei eseguire la chiamata così o comunque in un modo simile:

Codice (Java): [Seleziona]
File mediaStorageDir = new File(Environment.getExternalStorageDirectory(Environment.DIRECTORY_PICTURES), "Parking Reminder");
Solo che non posso, perché se la scrivo così si ripresenta puntuale il problema "DIRECTORY_PICTURES cannot be resolved as a type or field" in Eclipse. La vera questione quindi è: come modifico la compatibilità della prima funzione (pensata per Froyo e successivi) con le API precedenti senza dover "restringere" la compatibilità ai device con Android 2.2 e successivi?
Grazie per la pazienza, come potete vedere sono alle prime armi sia con java che di conseguenza con lo sviluppo su Android e ho molto da imparare  :-[


EDIT:
Aggiungo comunque il log così magari può essere di aiuto lo stesso. Naturalmente il log si riferisce solo al caso in cui, modificando la chiamata come ho descritto nel secondo riquadro di codice, riesco ad eseguire l'applicazione perchè eclipse non da errori. Aggiungo inoltre che il crash non si verifica su tutta l'applicazione ma solo sul processo della fotocamera. Infatti dopo il messaggio a schermo del crash del processo si ripresenta la schermata principale della mia app. L'applicazione è eseguita su Android 2.3.6 originale, Nexus S.

Codice: [Seleziona]
03-14 00:48:45.828: D/dalvikvm(8341): GC_EXTERNAL_ALLOC freed 50K, 50% free 2716K/5379K, external 1625K/2137K, paused 66ms
03-14 00:48:48.441: D/dalvikvm(8341): GC_EXTERNAL_ALLOC freed 32K, 49% free 2780K/5379K, external 3594K/3903K, paused 50ms
03-14 00:48:49.933: D/dalvikvm(8341): GC_EXTERNAL_ALLOC freed 22K, 48% free 2839K/5379K, external 5719K/6361K, paused 41ms
03-14 00:48:53.757: W/IInputConnectionWrapper(8341): showStatusIcon on inactive InputConnection
03-14 00:48:59.937: D/AndroidRuntime(8341): Shutting down VM
03-14 00:48:59.937: W/dalvikvm(8341): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-14 00:48:59.968: E/AndroidRuntime(8341): FATAL EXCEPTION: main
03-14 00:48:59.968: E/AndroidRuntime(8341): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=100, result=-1, data=null} to activity {parking.reminder/parking.reminder.TakePhotoActivity}: java.lang.NullPointerException
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.app.ActivityThread.access$2000(ActivityThread.java:117)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.os.Handler.dispatchMessage(Handler.java:99)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.os.Looper.loop(Looper.java:130)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.app.ActivityThread.main(ActivityThread.java:3683)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at java.lang.reflect.Method.invokeNative(Native Method)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at java.lang.reflect.Method.invoke(Method.java:507)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at dalvik.system.NativeStart.main(Native Method)
03-14 00:48:59.968: E/AndroidRuntime(8341): Caused by: java.lang.NullPointerException
03-14 00:48:59.968: E/AndroidRuntime(8341):         at parking.reminder.TakePhotoActivity.onActivityResult(TakePhotoActivity.java:44)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.app.Activity.dispatchActivityResult(Activity.java:3908)
03-14 00:48:59.968: E/AndroidRuntime(8341):         at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
03-14 00:48:59.968: E/AndroidRuntime(8341):         ... 11 more
03-14 00:49:02.550: I/Process(8341): Sending signal. PID: 8341 SIG: 9
03-14 00:49:02.828: D/dalvikvm(8519): GC_EXTERNAL_ALLOC freed 43K, 50% free 2716K/5379K, external 1625K/2137K, paused 30ms
03-14 00:49:08.687: W/KeyCharacterMap(8519): No keyboard for id 131073
03-14 00:49:08.710: W/KeyCharacterMap(8519): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
03-14 00:49:09.191: W/IInputConnectionWrapper(8519): showStatusIcon on inactive InputConnection
« Ultima modifica: 14 Marzo 2012, 00:57:49 CET da NXS »

Offline NXS

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus S
  • Sistema operativo:
    Windows 7
Re:Problema con getExternalStorageDirectory
« Risposta #3 il: 15 Marzo 2012, 13:04:29 CET »
0
Ho aggirato il problema utilizzando le API 8 per il progetto.

Ora però mi si presenta un errore strano: funziona tutto correttamente, compreso il salvataggio del file dove voglio io etc, solo che quando scatto correttamente la foto, visualizzo un errore con il classico "il processo è terminato", quindi si riavvia la fotocamera e basta tornare indietro per tornare alla mia app. Posto codice completo della classe e logcat, spero che qualcuno riesca a essermi di aiuto grazie  :)


Codice (Java): [Seleziona]
package parking.reminder;




import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;


import android.app.Activity;
import android.content.Intent;
import android.net.Uri;


import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;
import parking.reminder.ParkingMenuActivity;




public class TakePhotoActivity extends Activity {
       
        private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
        private Uri fileUri;
       
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
       
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
       
                fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
                intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
                startActivityForResult(intent,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
                }
       
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == 0) {
                if (resultCode == RESULT_OK) {
                    // Image captured and saved to fileUri specified in the Intent
                    Toast.makeText(this, "Image saved to:\n" +
                             data.getData(), Toast.LENGTH_LONG).show();
                    Intent intent2 = new Intent();
                    intent2.setClass(this,ParkingMenuActivity.class);
                    startActivity(intent2);
                   
                } else if (resultCode == RESULT_CANCELED) {
                        Intent intent2 = new Intent();
                    intent2.setClass(this,ParkingMenuActivity.class);
                    startActivity(intent2);
                   
                    // User cancelled the image capture
                } else {
                        Intent intent2 = new Intent();
                    intent2.setClass(this,ParkingMenuActivity.class);
                    startActivity(intent2);
                   
                    // Image capture failed, advise user
                }
            }
           
        }
        public static final int MEDIA_TYPE_IMAGE = 1;




        /** Create a file Uri for saving an image or video */
        private static Uri getOutputMediaFileUri(int type){
              return Uri.fromFile(getOutputMediaFile(type));
        }
       
       
        private static File getOutputMediaFile(int type){
               
                boolean mExternalStorageAvailable = false;
        boolean mExternalStorageWriteable = false;
        //Check that the SDCard is mounted
        String state = Environment.getExternalStorageState();


        if (Environment.MEDIA_MOUNTED.equals(state)) {
            // We can read and write the media
            mExternalStorageAvailable = mExternalStorageWriteable = true;
        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            // We can only read the media
            mExternalStorageAvailable = true;
            mExternalStorageWriteable = false;
        } else {
            // Something else is wrong. It may be one of many other states, but all we need
            //  to know is we can neither read nor write
            mExternalStorageAvailable = mExternalStorageWriteable = false;
        }
           
            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Parking Reminder");
            // This location works best if you want the created images to be shared
            // between applications and persist after your app has been uninstalled.


            // Create the storage directory if it does not exist
            if (! mediaStorageDir.exists()){
                if (! mediaStorageDir.mkdirs()){
                    Log.d("Parking Reminder", "failed to create directory");
                    return null;
                }
               
            }


            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile;
            if (type == MEDIA_TYPE_IMAGE){
                mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");
               
            } else {
                return null;
            }


            return mediaFile;
        }
        }


Questo invece è il logcat:



Codice: [Seleziona]
03-15 13:03:07.164: D/dalvikvm(9903): GC_EXTERNAL_ALLOC freed 33K, 49% free 2780K/5379K, external 3594K/3903K, paused 19ms
03-15 13:03:09.445: W/IInputConnectionWrapper(9903): showStatusIcon on inactive InputConnection
03-15 13:03:14.878: D/AndroidRuntime(9903): Shutting down VM
03-15 13:03:14.878: W/dalvikvm(9903): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-15 13:03:14.898: E/AndroidRuntime(9903): FATAL EXCEPTION: main
03-15 13:03:14.898: E/AndroidRuntime(9903): java.lang.RuntimeException: Unable to resume activity {parking.reminder/parking.reminder.TakePhotoActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {parking.reminder/parking.reminder.TakePhotoActivity}: java.lang.NullPointerException
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2832)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.access$1600(ActivityThread.java:117)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.os.Handler.dispatchMessage(Handler.java:99)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.os.Looper.loop(Looper.java:130)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.main(ActivityThread.java:3683)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at java.lang.reflect.Method.invokeNative(Native Method)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at java.lang.reflect.Method.invoke(Method.java:507)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at dalvik.system.NativeStart.main(Native Method)
03-15 13:03:14.898: E/AndroidRuntime(9903): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=null} to activity {parking.reminder/parking.reminder.TakePhotoActivity}: java.lang.NullPointerException
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2107)
03-15 13:03:14.898: E/AndroidRuntime(9903):         ... 13 more
03-15 13:03:14.898: E/AndroidRuntime(9903): Caused by: java.lang.NullPointerException
03-15 13:03:14.898: E/AndroidRuntime(9903):         at parking.reminder.TakePhotoActivity.onActivityResult(TakePhotoActivity.java:41)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.Activity.dispatchActivityResult(Activity.java:3908)
03-15 13:03:14.898: E/AndroidRuntime(9903):         at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)03-15 13:03:14.898: E/AndroidRuntime(9903):         ... 14 more

Offline NXS

  • Nuovo arrivato
  • *
  • Post: 7
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus S
  • Sistema operativo:
    Windows 7
Re:Problema con getExternalStorageDirectory
« Risposta #4 il: 15 Marzo 2012, 15:23:52 CET »
0
 :-P

Chi fa da se fa per tre come si suol dire!

Risolto il problema. mi sono accorto successivamente che c'era un conflitto fra l'activity di cui vi posterò adesso il codice e l'activity precedente che la richiamava tramite handleClick. E' bastato aggiungere un finish(); alla fine dell'activity per evitare il conflitto con l'activity della schermata principale. Posto il codice della classe così magari può tornare utile a qualcuno, visto che ci ho sbattuto la testa 2 giorni.

PS: sull'emulatore mi segnala comunque un errore, probabilmente a causa della gestione della fotocamera. Sul mio device (Nexus S) però funziona alla grande.

Codice (Java): [Seleziona]
package parking.reminder;


import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;

import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;



public class TakePhotoActivity extends Activity {
        private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
        private Uri fileUri;
       
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.parking);
       
        Intent photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
       
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
    photo.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name
    startActivityForResult(photo, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    finish();
}
       
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    // Image captured and saved to fileUri specified in the Intent
                    Toast.makeText(this, "Image saved to:\n" +
                             data.getData(), Toast.LENGTH_LONG).show();
                } else if (resultCode == RESULT_CANCELED) {
                    // User cancelled the image capture
                } else {
                    // Image capture failed, advise user
                }
            }
        }
       
       
        public static final int MEDIA_TYPE_IMAGE = 1;


        //Create a file Uri for saving an image
        private static Uri getOutputMediaFileUri(int type){
              return Uri.fromFile(getOutputMediaFile(type));
        }
       
       
        private static File getOutputMediaFile(int type){
                           
            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Parking Reminder");
            // This location works best if you want the created images to be shared
            // between applications and persist after your app has been uninstalled.

            // Create the storage directory if it does not exist
            if (! mediaStorageDir.exists()){
                if (! mediaStorageDir.mkdirs()){
                    Log.d("Parking Reminder", "failed to create directory");
                    return null;
                }
               
            }

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile;
            if (type == MEDIA_TYPE_IMAGE){
                mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");
               
            } else {
                return null;
            }

            return mediaFile;
           
        }
       
}

La classe viene richiamata dal main in questo modo:

Codice (Java): [Seleziona]
package parking.reminder;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class ParkingMenuActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.parking);
        }
        public void handleClick(View v){
                 Intent intent = new Intent();
             intent.setClass(this,TakePhotoActivity.class);
             startActivity(intent);
        }

Spero sia utile a qualcuno! 8-)
« Ultima modifica: 15 Marzo 2012, 15:26:40 CET da NXS »