Autore Topic: ImageView ruotate a sinistra di 90° dopo lo scatto  (Letto 677 volte)

Offline First01

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
ImageView ruotate a sinistra di 90° dopo lo scatto
« il: 15 Settembre 2013, 11:50:32 CEST »
0
Salve,
ho un problema nell'utilizzo della camera android all'interno di una app che sto facendo. Una volta avviata la fotocamera, scatto una foto, premo il pulsante SALVA, e dopo di che la foto scattata mi appare ruotata a sinistra di 90° e di dimensioni minori rispetto allo scatto.
Sapete a cosa è dovuto e come posso risolvere ?
Per il codice sull'uso della fotocamera, ho seguito il tutorial ufficiale di android.

Grazie mille!

Offline pentawire

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
    • Pentawire - Apps, software and games
  • Dispositivo Android:
    S2 Plus
  • Play Store ID:
    Pentawire
  • Sistema operativo:
    Windows 8, Ubuntu
Re:ImageView ruotate a sinistra di 90° dopo lo scatto
« Risposta #1 il: 15 Settembre 2013, 12:21:04 CEST »
0
puoi postare il codice!!!
Pentawire - Apps, software and games
- Pentawire
- https://www.facebook.com/pentawire

Offline First01

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
Re:ImageView ruotate a sinistra di 90° dopo lo scatto
« Risposta #2 il: 15 Settembre 2013, 12:33:08 CEST »
0
Codice (Java): [Seleziona]
public class CameraActivity extends Activity {
       
private static final int ACTION_TAKE_PHOTO_B = 1;
       

        private static final String BITMAP_STORAGE_KEY = "viewbitmap";
        private static final String IMAGEVIEW_VISIBILITY_STORAGE_KEY = "imageviewvisibility";
        private ImageView mImageView;
        private Bitmap mImageBitmap;
       


        private String mCurrentPhotoPath;

        private static final String JPEG_FILE_PREFIX = "IMG_";
        private static final String JPEG_FILE_SUFFIX = ".jpg";

        private AlbumStorageDirFactory mAlbumStorageDirFactory = null;

       
        /* Imposto l'album all'interno della galleria principale in cui saranno salvate le foto */
        private String getAlbumName() {
                return getString(R.string.album_name);    
        }

       
        private File getAlbumDir() {
                File storageDir = null;

                if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
                       
                        storageDir = mAlbumStorageDirFactory.getAlbumStorageDir(getAlbumName());

                        if (storageDir != null) {
                                if (! storageDir.mkdirs()) {
                                        if (! storageDir.exists()){
                                                Log.d("Camera Sample", "failed to create directory");
                                                return null;
                                        }
                                }
                        }
                       
                } else {
                        Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE.");
                }
               
                return storageDir;
        }

        private File createImageFile() throws IOException {
                // Create an image file name
                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";
                File albumF = getAlbumDir();
                File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF);
                return imageF;
        }

        private File setUpPhotoFile() throws IOException {
               
                File f = createImageFile();
                mCurrentPhotoPath = f.getAbsolutePath();
               
                return f;
        }

        private void setPic() {

                /* There isn't enough memory to open up more than a couple camera photos */
                /* So pre-scale the target bitmap into which the file is decoded */

                /* Get the size of the ImageView */
                int targetW = mImageView.getWidth();
                int targetH = mImageView.getHeight();

                /* Get the size of the image */
                BitmapFactory.Options bmOptions = new BitmapFactory.Options();
                bmOptions.inJustDecodeBounds = true;
                BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
                int photoW = bmOptions.outWidth;
                int photoH = bmOptions.outHeight;
               
                /* Figure out which way needs to be reduced less */
                int scaleFactor = 1;
                if ((targetW > 0) || (targetH > 0)) {
                        scaleFactor = Math.min(photoW/targetW, photoH/targetH);
                }

                /* Set bitmap options to scale the image decode target */
                bmOptions.inJustDecodeBounds = false;
                bmOptions.inSampleSize = scaleFactor;
                bmOptions.inPurgeable = true;

                /* Decode the JPEG file into a Bitmap */
                Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
               
                /* Associo il Bitmap alla ImageView */
                mImageView.setImageBitmap(bitmap);
               
                mImageView.setVisibility(View.VISIBLE);    // imposto la visibilità
               
                       
        }

        private void galleryAddPic() {
                    Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");
                        File f = new File(mCurrentPhotoPath);
                    Uri contentUri = Uri.fromFile(f);
                    mediaScanIntent.setData(contentUri);
                    this.sendBroadcast(mediaScanIntent);
        }

        private void dispatchTakePictureIntent(int actionCode) {

                Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

                switch(actionCode) {
                case ACTION_TAKE_PHOTO_B:
                        File f = null;
                       
                        try {
                                f = setUpPhotoFile();
                                mCurrentPhotoPath = f.getAbsolutePath();
                                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                        } catch (IOException e) {
                                e.printStackTrace();
                                f = null;
                                mCurrentPhotoPath = null;
                        }
                        break;

                default:
                        break;                 
                } // switch

                startActivityForResult(takePictureIntent, actionCode);
        }

       

       

        private void handleBigCameraPhoto() {

                if (mCurrentPhotoPath != null) {
                        setPic();
                        galleryAddPic();
                        mCurrentPhotoPath = null;
                }

        }

       
        Button.OnClickListener mTakePicOnClickListener =
                new Button.OnClickListener() {
                @Override
                public void onClick(View v) {
                        dispatchTakePictureIntent(ACTION_TAKE_PHOTO_B);
                }
        };

       
       
       
       

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_camera);
               
                mImageView = (ImageView) findViewById(R.id.imageView1);
               
                mImageBitmap = null;
               

                Button scatta = (Button) findViewById(R.id.fotobutton);
                setBtnListenerOrDisable(
                                scatta,
                                mTakePicOnClickListener,
                                MediaStore.ACTION_IMAGE_CAPTURE
                );
               
               
                // pulsante per visualizzare la GALLERIA
                Button raccolta = (Button) this.findViewById(R.id.buttongallery);
                raccolta.setOnClickListener(new View.OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                startGalleriaActivity();        //lancio la activity relativa alla Galleria
                        }              
                });
               
               
               
                        mAlbumStorageDirFactory = new BaseAlbumDirFactory();
        }
       
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
               
               
                if (resultCode == RESULT_OK) {
                        handleBigCameraPhoto();
                }
               
                }
               

// Some lifecycle callbacks so that the image can survive orientation change
@Override
protected void onSaveInstanceState(Bundle outState) {
        outState.putParcelable(BITMAP_STORAGE_KEY, mImageBitmap);
       
        outState.putBoolean(IMAGEVIEW_VISIBILITY_STORAGE_KEY, (mImageBitmap != null) );
       
        super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        mImageBitmap = savedInstanceState.getParcelable(BITMAP_STORAGE_KEY);
        mImageView.setImageBitmap(mImageBitmap);
        mImageView.setVisibility(
                        savedInstanceState.getBoolean(IMAGEVIEW_VISIBILITY_STORAGE_KEY) ?
                                        ImageView.VISIBLE : ImageView.INVISIBLE
        );
       
       
}

/**
 * Indicates whether the specified action can be used as an intent. This
 * method queries the package manager for installed packages that can
 * respond to an intent with the specified action. If no suitable package is
 * found, this method returns false.
 * [url=http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html]Can I use this Intent? | Android Developers Blog[/url]
 *
 * @param context The application's environment.
 * @param action The Intent action to check for availability.
 *
 * @return True if an Intent with the specified action can be sent and
 *         responded to, false otherwise.
 */

public static boolean isIntentAvailable(Context context, String action) {
        final PackageManager packageManager = context.getPackageManager();
        final Intent intent = new Intent(action);
        List<ResolveInfo> list =
                packageManager.queryIntentActivities(intent,
                                PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
}

private void setBtnListenerOrDisable(
                Button btn,
                Button.OnClickListener onClickListener,
                String intentName
)
{
        if (isIntentAvailable(this, intentName)) {
                btn.setOnClickListener(onClickListener);               
        } else {
                btn.setText(
                        getText(R.string.cannot).toString() + " " + btn.getText());
                btn.setClickable(false);
        }
}

private void startGalleriaActivity() {
        // TODO Auto-generated method stub
        Intent intent = new Intent (this,GalleriaActivity.class);
        startActivity(intent);
}
       

}

Post unito: 15 Settembre 2013, 18:38:24 CEST
leggendo altre guide ho capito che questo problema si presenta quando (come nel mio caso) la foto viene scattata tenendo lo smartphone in posizione verticale, mentre quando si scatta in modalità orizzontale la foto non viene ruotata dopo il salvataggio..
Qualcuno saprebbe aiutarmi ??

Grazie
« Ultima modifica: 15 Settembre 2013, 18:38:24 CEST da First01, Reason: Merged DoublePost »