Autore Topic: problema orientamento camera e salvataggio foto  (Letto 4145 volte)

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
problema orientamento camera e salvataggio foto
« il: 20 Novembre 2011, 15:07:42 CET »
0
ragazzi aiutoooooo !!
sto impazzendo, ho provato a seguire tutti i tutorial trovati in rete, ma nella mia applicazione l'immagine risulta sempre con un'orientamento sbagliato..
come da tutorial ho inserito mCamera.setDisplayOrientation(90); , ma eclipse non accetta setDisplayOrientation..
k'altro problema e' che quando salvo la foto appena scattata, non mi appare nella galleria fino a che non riavvio il telefono..please, aiutatemi.
il codice e' questo:
Codice (Java): [Seleziona]
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFormat(PixelFormat.TRANSLUCENT); //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.layout.fotomanostart);

        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) {
                 
              // creo stringa con data e ora
                  Date today;
                  String result;
                  SimpleDateFormat formatter;
                  Locale zona=Locale.getDefault();
                  formatter = new SimpleDateFormat("d-MMM-yyyy-HH_mm_ss",zona);
                  today = new Date();
                  result = formatter.format(today);
                  System.out.println("Locale: " + zona);
                  System.out.println("Result: " + result);


                    String nameFile = result+".jpg";
                    String imgext=new String("/external_sd/Foto/");
                    File rootext=(Environment.getExternalStorageDirectory());
                    File img1=new File(rootext,imgext);
                    File img=new File(img1,nameFile);
                    Log.v(TAG, "destinazione presa:"+rootext);
                    Log.v(TAG, "destinazione :"+img);
                    try {

                    img1.mkdirs(); // creo directory per salvare il file
                           
                            Bitmap myImage = BitmapFactory.decodeByteArray(_data,0,_data.length);
                        FileOutputStream fileOutputStream = new FileOutputStream(img);                                
                        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
                        myImage.compress(CompressFormat.JPEG, 100, bos);
                        bos.flush();
                        bos.close();


                                     
                    } catch (FileNotFoundException e) {
                            Log.e("demo", e.toString());

                    } catch (IOException e) {                  
                                        e.printStackTrace();
                                }


               
                //riparte la preview della camera
                mCamera.startPreview();
                }
        };


        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(0).width;  //setta la risoluzione massima
        int picture_height = list.get(0).height;//setta la risoluzione massima
        p.setPictureSize(picture_width, picture_height);        //setto la camera alla risoluzione preferita
        p.setJpegQuality(100);  // setta la qualita di compressione JPEG
        p.setFlashMode("off");
        p.setRotation(90); // +++++++++++++++ho provato a girare la camera con questo, ma non succede nulla+++++++++++++
        p.setFocusMode("auto");

        // salvo le pref
        mCamera.setParameters(p);


       
       
        try {
                //lancio la preview

                        mCamera.setPreviewDisplay(arg0);
                                   //      mCamera.setDisplayOrientation(90); // ++++++++++eclipse non accetta questo parametro+++++++
                        mCamera.startPreview();
                        mPreviewRunning = true;
                } catch (IOException e) {
                        //gestione errore
                }
       
               
        }

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

        public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mPreviewRunning = false;
        mCamera.release();
                Log.v(TAG, "camera rilasciata");
        }
}

nel manifest ho messo questo:
Codice (XML): [Seleziona]
    <uses-sdk android:minSdkVersion="7" />
        <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <application android:debuggable="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
       android:screenOrientation="portrait">
« Ultima modifica: 20 Novembre 2011, 15:09:52 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Zate

  • Visitatore
Re:problema orientamento camera e salvataggio foto
« Risposta #1 il: 20 Novembre 2011, 15:24:26 CET »
0
Prova cancellare

android:screenOrientation="portrait"

E se non l'hai già attivata, attiva la rotazione automatica nelle impostazioni del cellulare.

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:problema orientamento camera e salvataggio foto
« Risposta #2 il: 20 Novembre 2011, 20:16:27 CET »
0
la rotazione è attiva, ho provato a cancellare la riga  che hai detto, ma non e' cambiato nulla..ho anche provato a impostarlo in landscape, ma nulla nemmeno cosi..l'immagine risulta sempre girata..
per vedere l'immagine dritta devo ruotare il telefono di 180 gradi..
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:problema orientamento camera e salvataggio foto
« Risposta #3 il: 23 Dicembre 2011, 17:20:30 CET »
0
ragazzi mi serve il vostro aiuto :(
sto provando a fare tutte le modifiche che riesco, ma modificando da portrait a landscape o lasciando in automatico, mi trovo sempre nella situazione in cui le foto scattate con telefono orizzontale (landscape) vengono perfettamente...ma quelle scattate con telefono in verticale (portrait) vengono ruotate di 90 gradi..
non so proprio come risolvere questo problema..
il telefono che uso per il debug è un galaxy s con adroid 2.3, l'app è per android 2.3 e l'applicazione è un'applicazione che scatta 3 foto e poi attende un tocco sul display per chiudersi.
il codice a cui sono arrivato è questo:
manifest
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="autoscatto.prova"
   android:versionCode="1"
   android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
 <uses-permission android:name="android.permission.RECORD_VIDEO"/>
        <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <application android:debuggable="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
       android:configChanges="orientation"
       android:screenOrientation="portrait">
        <activity
           android:label="@string/app_name"
           android:name=".Autoscatto" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Codice (Java): [Seleziona]
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.PowerManager;
import android.os.Vibrator;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;


public class Autoscatto extends Activity implements SurfaceHolder.Callback{
       
        /* VARIABILI PRIVATE */
        protected PowerManager.WakeLock mWakeLock;
       
        private Vibrator vibrator;
        private int counter=0;
        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;
        private Camera mCamera;
        private boolean mPreviewRunning;
        String TAG;
        AudioManager audio;
        int curMode;
        int curVibr;
        int curVolumenot;
        int curVolumecur;
    int curVolumecal;
        int curVolumesyst;
        int curVolumemus;
        int curVolumering;
        Timer timer = new Timer();
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        getWindow().setFormat(PixelFormat.TRANSLUCENT); //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.layout.main);
       
                mSurfaceView = (SurfaceView)findViewById(R.id.camera_surface);
                mSurfaceView.setClickable(false);
        vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
       
        final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
        this.mWakeLock.acquire();

        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

    }
        public void siparte(){
               
        counter++;
        if (counter == 3) {
               
                sifinisce();
        }
        else{
                conteggio();
        }}
        private void conteggio(){

            timer.schedule( new TimerTask() {
                   
                    public void run () {


                               
                                        mCamera.takePicture(null, null, jpegCallback);
                                        vibrator.vibrate(300);
                                        Log.v(TAG, "scattata");

                    }

            }, 10000 );
           
            }
   

        PictureCallback jpegCallback = new PictureCallback() {
                public void onPictureTaken(byte[] _data, Camera _camera) {
                 
              // creo stringa con data e ora
                  Date today;
                  String result;
                  SimpleDateFormat formatter;
                  Locale zona=Locale.getDefault();
                  formatter = new SimpleDateFormat("d-MMM-yyyy-HH_mm_ss",zona);
                  today = new Date();
                  result = formatter.format(today);
                  System.out.println("Locale: " + zona);
                  System.out.println("Result: " + result);


                    String nameFile = result+".jpg";
                    String imgext=new String("/external_sd/autoscatto/");
                    File rootext=(Environment.getExternalStorageDirectory());
                  File img1=new File(rootext,imgext);  
                  File img=new File(img1,nameFile);
                    Log.v(TAG, "destinazione presa:"+rootext);
                    Log.v(TAG, "destinazione :"+img);
                    try {

                    img1.mkdirs(); // creo directory per salvare il file
                           
                            Bitmap myImage = BitmapFactory.decodeByteArray(_data,0,_data.length);
                           
                       
                        FileOutputStream fileOutputStream = new FileOutputStream(img);
                                                       
                        BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);

                        myImage.compress(CompressFormat.JPEG, 100, bos);
                       
                        bos.flush();
                        bos.close();

                    } catch (FileNotFoundException e) {
                            Log.e("demo", e.toString());

                    } catch (IOException e) {
                        Log.v(TAG, "errore ioexception");
                                        e.printStackTrace();
                                }


               
                //riparte la preview della camera
                mCamera.startPreview();

                siparte();

                }
        };


        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
                if (mPreviewRunning)
                        mCamera.stopPreview();
                Log.v(TAG, "preview fermato da surfacechanged");

               
               
                //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; //setta la risoluzione minima
      //  int picture_height = list.get(list.size()-1).height;//setta la risoluzione minima
        int picture_width = list.get(0).width;  //setta la risoluzione massima
        int picture_height = list.get(0).height;//setta la risoluzione massima
        p.setPictureSize(picture_width, picture_height);        //setto la camera alla risoluzione preferita
        p.setJpegQuality(100);  // setta la qualita di compressione JPEG
        p.setRotation(90);
        p.setFlashMode("off");
        p.setFocusMode("auto");

        // salvo le pref
        mCamera.setParameters(p);


       
       
        try {
                //lancio la preview
                mCamera.setDisplayOrientation(90);
                        mCamera.setPreviewDisplay(arg0);
                        mCamera.startPreview();
                        mPreviewRunning = true;
                        Log.v(TAG, "preview lanciata");
                } catch (IOException e) {
                        //gestione errore
                }
       
               
        }

        public void surfaceCreated(SurfaceHolder holder) {
                mCamera = Camera.open();
                Log.v(TAG, "surface creato");
                siparte();
               
        }

        public void surfaceDestroyed(SurfaceHolder holder) {

                Log.v(TAG, "surface distrutto");
        mCamera.stopPreview();
        mPreviewRunning = false;
        mCamera.release();
                Log.v(TAG, "camera rilasciata");

        }
        private void chiudi() {
                this.mWakeLock.release();
                Log.v(TAG, "tolgo schermo sempre attivo e chiudo");
                finish();
        }
        private void sifinisce(){
                vibrator.vibrate(600);
                Log.v(TAG, "vibrazione di sifinisce()");
                mSurfaceView.setClickable(true);
                Log.v(TAG, "schermo cliccabile");
                vibrator.cancel();
                timer.cancel();
                Log.v(TAG, "vibrator chiuso");
        //  inserire mediascannerconnection per refresh mediascanner
       
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse
                        ("file://"+ Environment.getExternalStorageDirectory())));
 
//fine mediascannerconnection

                mSurfaceView.setOnClickListener(new OnClickListener(){
                        public void onClick(View v) {
                                chiudi();
                               
                }});}


        }
« Ultima modifica: 07 Gennaio 2012, 18:55:36 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:problema orientamento camera e salvataggio foto
« Risposta #4 il: 07 Gennaio 2012, 18:51:22 CET »
0
up
ragazzi scusate su uppo, ma dopo una vita che faccio prove, sono ancora bloccato con questa maledetta app :(
in pratica le foto in landscape sono perfette..ma la mia app ha la necessità di fare le foto in portrait :(
la foto in portrait viene scattata in modo corretto ma nella sd me la salva ruotata di 90° in senso antiorario..per vederla correttamente nella galleria devo cliccare nella foto e selezionare la voce "ruota di 90°"..
ho provato anche a invertire le dimensioni di height e widht, ma il risultato è uguale a prima, ma con la foto di dimensioni minori.
esiste un modo particolare che non conosco per salvare le foto fatte in modalità portrait?
con l'applicazione camera originale, se scatto una foto in portrait, me la salva in modo corretto..ma proprio non riesco a capire il motivo per cui la mia app la salva girata, nonostante la foto sia corretta.
per chiarire ancora maglio il problema, vi faccio un'esempio:
se fotografo una persona in piedi con il telefono in portrait, la foto viene salvata in landscape con la testa della persona a sinistra..e ruotando la foto di 90°, la foto viene visualizzata nel modo corretto..
help meeee :(

esempio pratico:
la foto scattata, viene salvata cosi:

se la ruoto dalla galleria diventa cosi (come dovrebbe essere gia dal salvataggio):
« Ultima modifica: 07 Gennaio 2012, 19:15:10 CET da frecciak »
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline rivolaldo

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • rivolaldo
    • @maurentus
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy SII
  • Sistema operativo:
    Windows 7
Re:problema orientamento camera e salvataggio foto
« Risposta #5 il: 10 Marzo 2012, 11:30:09 CET »
0
Ciao a tutti! Qualcuno ha risolto il problema posto da frecciak??
Anche a me succede la stessa cosa e cioè che se scatto una foto in modalità portrait, questa viene salvata nella sdcard ma ruotata, mentre se scatto una foto col cell in orizzontale (landscape) la foto viene salvata correttamente!
Grazie!

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:problema orientamento camera e salvataggio foto
« Risposta #6 il: 10 Marzo 2012, 12:28:53 CET »
0
Non è elegante ma magari potreste provare che succede posto non l'abbiate già fatto

Codice (Java): [Seleziona]
if (getResources().getConfiguration().orientation==Configuration.ORIENTATION_PORTRAIT){
Matrix m=new Matrix();
m.setRotate(90);
foto=Bitmap.createBitmap(foto, 0, 0, foto.getWidth(), foto.getHeight(), m, false);
}
//poi salvare la foto ruotata
Odio l'inglese e per un informatico non è il massimo

Offline Reinhard

  • Utente junior
  • **
  • Post: 85
  • Respect: +16
    • Google+
    • rspisser
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5 Lollipop 5.1
  • Play Store ID:
    rspisser
  • Sistema operativo:
    Windows 7
Re:problema orientamento camera e salvataggio foto
« Risposta #7 il: 10 Marzo 2012, 14:05:26 CET »
0

Ciao,

te lo fa con tutte le versioni di Android?

ho lo stesso problema per la mia app, ma ho notato che lo fa con Android 4 , mentre con Android 2.3.7 no.

Non ho ancora riuscito a risolvere la questione.

Offline frecciak

  • Utente normale
  • ***
  • Post: 231
  • Respect: +16
    • Mostra profilo
  • Dispositivo Android:
    galaxy s
  • Sistema operativo:
    windows 7
Re:problema orientamento camera e salvataggio foto
« Risposta #8 il: 10 Marzo 2012, 14:13:23 CET »
0
pivoide avevo gia provato con il matrix, ma purtroppo anche in questo modo, si comporta diversamente su diversi dispositivi :(
ho notato che in base al tipo di telefono, alcuni gestiscono autonomamente la rotazione, altri no..quindi in quelli che la gestiscono autonomamente ci si ritrova l'immagine girata di 180° (90 autonomi e 90 dal matrix) mentre negli altri ci si ritrova l'immagine normale..

probabilmente si potrebbe risolvere facendo un controllo sull'altezza e la larghezza dell'immagine e far partire il matrix solo se l'immagine risulta ruotata..però si dovrebbe avere un bel numero di dispositivi per fare i vari test..e io non ho la possibilità :D
Se le risposte ti hanno aiutato, metti un ..a te non costa nulla, ma a chi ti ha aiutato fa molto piacere riceverlo!!

Offline rivolaldo

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • rivolaldo
    • @maurentus
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy SII
  • Sistema operativo:
    Windows 7
Re:problema orientamento camera e salvataggio foto
« Risposta #9 il: 10 Marzo 2012, 14:23:43 CET »
0
A me lo fa sul Galaxy s2 versione 2.3.5 ma l'applicazione che sto sviluppando su Eclipse è con Android 2.2. Con il suggerimento di pivoide però la foto scattata con il cell in verticale si è raddrizzata, ovviamente se la faccio in landscape esce ruotata.
Come dice frecciak però può darsi che su alcuni dispositivi questa soluzione vada bene mentre per altri no...