Autore Topic: inserire foto in una cartella e dare la possibilità all'utente di crearla  (Letto 713 volte)

Offline Andrew Tartaglia

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S3
  • Sistema operativo:
    Windows 7/8
 Sono nuovo di Android e sto creando un app abbastanza semplice sono riuscito a gestire la fotocamera e a salvare la foto in una cartella ma il mio problema è che quando salvo la foto nella suddetta cartella vorrei dare la possibilità all utente di cambiare il nome della cartella, ho fatto anche questo, ma per essere più chiaro vi mostro il mio codice grazie.

Codice (Java): [Seleziona]
public class CameraView extends Activity implements SurfaceHolder.Callback{
       
        protected static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;



        protected static final String TAG = null;
       
       
       
        /* VARIABILI PRIVATE */
        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;
        private Camera mCamera;
        private boolean mPreviewRunning;
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
       
       
       
        getWindow().setFormat(PixelFormat.TRANSPARENT); //aggiungo il traslucido
        requestWindowFeature(Window.FEATURE_NO_TITLE);  //no barra titolo
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   //full screen
       
        setContentView(R.layo
       
       
       
       
       
        ut.main);
       
        ImageButton buttonPicture = (ImageButton) findViewById(R.id.camera_surface_button);
                buttonPicture.setOnClickListener(new OnClickListener(){
                        public void onClick(View v) {
                               
                                mCamera.takePicture(null, null,                        


                   

        jpegCallback);

                        }
                });
               
                mSurfaceView = (SurfaceView)findViewById(R.id.camera_surface);
        mSurfaceHolder = mSurfaceView.getHolder();      //recupero l'holder della surfaceview
        mSurfaceHolder.addCallback(this);       //faccio la bind alla nostra activity
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        //tipo di surface, suggerito nei tutorial ufficiali
    }
   
   
   
    PictureCallback jpegCallback = new PictureCallback() {
               
        public void onPictureTaken(byte[] data, Camera camera) {
                        //riparte la preview della camera
                   
                File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
            if (pictureFile == null){
                Throwable e = null;
                                Log.d(TAG, "Error creating media file, check storage permissions: " +
                    e.getMessage());
                return;
            }

            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {
                Log.d(TAG, "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d(TAG, "Error accessing file: " + e.getMessage());
            }
               
            mCamera.startPreview();
       
        } };
        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
                if (mPreviewRunning)
                        mCamera.stopPreview();
               
                //setto le preferenze
                Camera.Parameters p = mCamera.getParameters();  //prendo le preferenze della camera
                p.setPreviewSize(arg2, arg3);
                ArrayList<Size> list = (ArrayList<Size>) p.getSupportedPictureSizes();  //recuepro le risoluzioni supportate dalla camera
        int picture_width = list.get(list.size()-1).width;
        int picture_height = list.get(list.size()-1).height;
        p.setPictureSize(picture_width, picture_height);        //setto la camera alla risoluzione pi� bassa
        p.setJpegQuality(80);   // qualitˆ compressione JPEG
       
        // salvo le pref
        mCamera.setParameters(p);
        try {
                //lancio la preview
                        mCamera.setPreviewDisplay(arg0);       
                        mCamera.startPreview();
                        mPreviewRunning = true;
                } catch (IOException e) {
                        //gestione errore
                }
       
               
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
                mCamera = Camera.open();
               
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mPreviewRunning = false;
        mCamera.release();
               
        }
       
       
        public static final int MEDIA_TYPE_IMAGE = 1;
       
        final String direct = this.getIntent().getStringExtra("key");
        /** Create a file Uri for saving an image or video */
        Uri uriSavedImage=Uri.fromFile(new File( direct + "photo.jpg"));
       
        /** Create a File for saving an image or video */
        private static File getOutputMediaFile(int type){
            // To be safe, you should check that the SDCard is mounted
            // using Environment.getExternalStorageState() before doing this.

               
               
            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                      Environment.DIRECTORY_PICTURES),"Ca.si.o");
            // 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("MyCameraApp", "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;
        }
       
}

aggiungo anche il codice per far creare la cartella all utente

Codice (Java): [Seleziona]
         public class MainCamera extends Activity {
         @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.inizio);
               

                Button b = (Button) findViewById(R.id.button1);
                b.setOnClickListener(new OnClickListener() {


                    EditText text = (EditText)findViewById(R.id.editText1);
                    EditText text2 = (EditText)findViewById(R.id.editText2);
                    EditText text3 = (EditText)findViewById(R.id.editText3);



                    @Override
                   
                   
                   
                    public void onClick(View v) {

                       
                       
                        final String name = text.getText().toString();
                        final String placeName = text2.getText().toString();
                        final String dettaglio =text3.getText().toString();

                       
                       
                        String place = placeName.substring(0,3);
                        String direct = name + place + dettaglio ;

                        File folder = new File("/sdcard/CameraTest/" + direct + "/");
                        folder.mkdirs();

                       
                       
                        Intent myIntent = new Intent(MainCamera.this, CameraView.class);
                        myIntent.putExtra("key", "/sdcard/CameraTest/" + direct + "/");
                        startActivity(myIntent);

                   
                   
                    }
                });
               
            }


           
           
        }


Grazie

Offline matttt

Re:inserire foto in una cartella e dare la possibilità all'utente di crearla
« Risposta #1 il: 22 Agosto 2013, 14:58:58 CEST »
0
Non ti conviene specificare un percorso in chiaro "/sdcard/..."
E' sempre meglio chiedere al sistema operativo di darti un percorso, ad esempio tramite:
Codice (Java): [Seleziona]
File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES );
Aggiungo altre 2 note:
- controlla anche che il percorso non sia null perché ci sono anche dispositivi senza partizioni esterne (esempio pratico: il Nexus 7) e fornisci delle alternative;
- non so se l'hai fatto ma per accedere ad un percorso su partizione esterna devi impostare i permessi di lettura / scrittura nel Manifest.
Le mie apps su Google Play Store:

Offline Andrew Tartaglia

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy S3
  • Sistema operativo:
    Windows 7/8
Re:inserire foto in una cartella e dare la possibilità all'utente di crearla
« Risposta #2 il: 22 Agosto 2013, 15:27:14 CEST »
0
Si ho aggiunto nel manifest tutto, all inizio ho provato a scrivere questo codice , che salva nella directory picture e crea una cartella e a ogni click mi salva l'immagine in quest 'ultima ma quello che non riesco a fare e far creare all'utente la cartella e far passare tramite intent il percorso uri dove salvare le immagini scattate
Ps : l app riesce a creare la cartella ma non riesco a far passare l'indirizzo di destinazione appena creato Grazie mille sto impazzendo :)
 
Codice (Java): [Seleziona]
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 */
        private static File getOutputMediaFile(int type){
            // To be safe, you should check that the SDCard is mounted
            // using Environment.getExternalStorageState() before doing this.

            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                      Environment.DIRECTORY_PICTURES), "Ca.Si.O Camera");
            // 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("MyCameraApp", "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;
        }

Offline matttt

Re:inserire foto in una cartella e dare la possibilità all\'utente di crearla
« Risposta #3 il: 22 Agosto 2013, 15:37:49 CEST »
0
Intanto prova a cambiare questa riga:
Codice (Java): [Seleziona]
mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");con:
Codice (Java): [Seleziona]
mediaFile = new File( mediaStorageDir, "IMG_"+ timeStamp + ".jpg");
Eventualmente prova anche a fare debugging con Log.d per vedere se il percorso del file mediaFile corrisponde a quello che hai in mente tu.

Post unito: 22 Agosto 2013, 15:43:20 CEST
Per semplificare ulteriormente potresti fare:
Codice (Java): [Seleziona]
return new File( mediaStorageDir, "IMG_"+ timeStamp + ".jpg");
E' che non mi sembra che il problema si li... ti conviene fare debugging per capire se effettivamente "type == MEDIA_TYPE_IMAGE" e il percorso viene come ti aspetti.
« Ultima modifica: 22 Agosto 2013, 15:43:21 CEST da matttt, Reason: Merged DoublePost »
Le mie apps su Google Play Store:

Offline Gi4ng|

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S 4
  • Sistema operativo:
    Android 4ever
Re:inserire foto in una cartella e dare la possibilità all'utente di crearla
« Risposta #4 il: 23 Agosto 2013, 16:26:20 CEST »
0
esatto il problema non è li , la variabile direct contiene il percorso e il nome della cartella ! però in rete non ho trovato nulla !! :( c'è qualcosa che mi sfugge ma non so cosa ! !