Autore Topic: Scattare foto e memorizzarla  (Letto 850 volte)

Offline akus85

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • akus85
    • Mostra profilo
    • BitOverflow.it
  • Dispositivo Android:
    Galaxy Nexus S
  • Play Store ID:
    akus.py
  • Sistema operativo:
    Mac OS
Scattare foto e memorizzarla
« il: 26 Agosto 2011, 19:19:54 CEST »
0
Ho scritto il seguente codice per scattare una foto e memorizzarla sul telefono solo che la foto che ottengo è "distorta" come questa :


il codice che ho scritto è il seguente solo che non so dov'è l'errore...  :-\

Photo2Activity.java
Codice (Java): [Seleziona]
package it.Photo03;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import android.app.Activity;
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.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.view.View.OnClickListener;

public class Photo03Activity extends Activity implements SurfaceHolder.Callback{
    /** Called when the activity is first created. */
        private Button btn;
        private SurfaceView mSurfaceView;
        private SurfaceHolder mSurfaceHolder;
        private Camera mCamera;
        private final static String PHOTO_FILE_NAME = "/sdcard/DCIM/Camera/";
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.main);
        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener(){
                        @Override
                        public void onClick(View v) {
                                File f = new File(PHOTO_FILE_NAME,"photo.jpeg");
                                mCamera.takePicture(null, null, jpegCallback);
                        }
               
        });
                mSurfaceView = (SurfaceView)findViewById(R.id.surfaceView1);
        mSurfaceHolder = mSurfaceView.getHolder();
        mSurfaceHolder.addCallback(this);
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        mSurfaceHolder.setFixedSize(getWindow().getWindowManager()
                .getDefaultDisplay().getWidth(), getWindow().getWindowManager()
                .getDefaultDisplay().getHeight());
    }
   
    PictureCallback jpegCallback = new PictureCallback() {
                public void onPictureTaken(byte[] _data, Camera _camera) {
                        Bitmap bmp = BitmapFactory.decodeByteArray(_data, 0, _data.length);
                        String filename = "photo.jpg";
                        File pictureFile = new File(PHOTO_FILE_NAME + filename);
                        try{
                                FileOutputStream pfos = new FileOutputStream(pictureFile);
                                bmp.compress(CompressFormat.JPEG, 50, pfos);
                                pfos.flush();
                                pfos.close();
                        } catch (Exception e){}
                       
                        mCamera.stopPreview();
                        mCamera.release();
                        mCamera.startPreview();
                       
                }
        };

        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
                Camera.Parameters p = mCamera.getParameters();
                p.setPreviewSize(arg2, arg3);
                p.setPictureFormat(PixelFormat.JPEG);
        p.setPictureSize(500, 500);
        p.setJpegQuality(50);      
        mCamera.setParameters(p);
        mCamera.setDisplayOrientation(90);
       
        try {
                //lancio la preview
                        mCamera.setPreviewDisplay(arg0);       
                        mCamera.startPreview();
                } catch (IOException e) {}
        }

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

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();     
        }
}

main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent"
                   xmlns:android="http://schemas.android.com/apk/res/android">
                    <SurfaceView android:layout_height="fill_parent" android:id="@+id/surfaceView1"
                                android:layout_width="fill_parent"></SurfaceView>
                    <RelativeLayout android:layout_height="fill_parent" android:id="@+id/relativeLayout2" android:layout_width="wrap_content"
                                    android:layout_alignRight="@id/surfaceView1">                                  
                                     <Button android:layout_height="wrap_content" android:id="@+id/button1" android:layout_width="wrap_content"
                                           android:text="Take" android:layout_alignParentBottom="true" android:layout_centerInParent="true"></Button>
                   </RelativeLayout>
    </RelativeLayout>

AndroidManifest.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="it.Photo03"
     android:versionCode="1"
     android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".Photo03Activity"
                 android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>


Offline mscor

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Windows vista
Re:Scattare foto e memorizzarla
« Risposta #1 il: 20 Settembre 2011, 16:28:51 CEST »
0
Ciao, io sto facendo un programma molto simile al tuo e funziona. L'unica differenza che vedo con il mio è la seguente:

Codice (Java): [Seleziona]
public void onPictureTaken(byte[] _data, Camera _camera) {
                 //riparte la preview della camera
               
                // sets files properties
               
            Bitmap immagine = BitmapFactory.decodeByteArray(_data, 0, _data.length);
               
            //
                prelevadataora();
                //String filename = (path + File.separator + dataora.substring(0, 15) +".jpg");
                // save image
               try{
                // File file = new File(path,dataora.substring(0, 15) +".jpg");
                 FileOutputStream fout = new FileOutputStream(path+ "/" + dataora.substring(0, 15) +".jpg");
                 BufferedOutputStream bos = new BufferedOutputStream(fout);
                 if (immagine.compress(CompressFormat.JPEG, 100, bos)){
                         bos.flush();
                         bos.close();
                 }
                 else {
                         Toast.makeText(getApplicationContext(),"Errore di compressione", Toast.LENGTH_LONG).show();
                 }
               }
         catch(IOException e){
                 Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
         }
               
         camera.startPreview();

In pratica ho utilizzato  BufferedOutputStream bos = new BufferedOutputStream(fout); al posto del FileOutputStream diretto... non sò.

PS.: Ma a te si aggiorna la gallery?? Io devo riavviare il telefono e poi il file catturato da cam è presente..

« Ultima modifica: 20 Settembre 2011, 16:34:54 CEST da mscor »