2012-03-30 12 views
5

utilizzo la fotocamera per scattare foto e voglio memorizzare nel database (SQLite). Le foto memorizzate devono essere visualizzate in un'altra attività con visualizzazione elenco come questa list view images e this iam utilizzando questo codice scattare foto ma come memorizzare la foto nel database e visualizzare in un'altra attività qualsiasi idea, per favore aiuto .....Android Come salvare le immagini della telecamera nel database e visualizzare un'altra attività nella visualizzazione elenco?

grazie ....

questo è il codice per scattare foto

public class PhotoActivity extends Activity { 
    private static final int CAMERA_REQUEST = 1888; 
    public ImageView imageView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.photoactivity); 

     this.imageView = (ImageView)this.findViewById(R.id.imageView1);   

     Button B = (Button) this.findViewById(R.id.camera); 
     B.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(cameraIntent, CAMERA_REQUEST); 
      } 
     }); 
    }  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == CAMERA_REQUEST) { 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
      imageView.setImageBitmap(photo);     

     }  
    } 
} 
+0

Le bitmap non devono essere salvate direttamente nel database, ma su sd-card. Nel database è possibile salvare solo un riferimento a bitmap. Il salvataggio della bitmap direttamente nel database avrà un'enorme influenza sulle prestazioni. – Ewoks

+0

sto ampliando il BaseAdapter per Listview in quanto dovrebbe essere il codice per il metodo onActivityResult()? – Andie

risposta

3

CREATE DATABASE classe di supporto come this ..

a catturare l'immagine inserire l'immagine da convertire in byte:

Imagehelper help=new Imagehelper(this); 

    if (requestCode == CAMERA_REQUEST) { 
         Bitmap photo = (Bitmap) data.getExtras().get("data"); 
         imageView.setImageBitmap(photo); 
         ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
         photo.compress(Bitmap.CompressFormat.PNG, 100, stream); 
         byte[] byteArray = stream.toByteArray(); 

         help.insert(byteArray); 
    } 

Per recuperare Modulo database:

Imagehelper help=new Imagehelper(this); 

     Cursor c= help.getAll(); 
     int i=0; 
     if(c.getCount()>0) 
     { 
      Bitmap[] array=new Bitmap[c.getCount()]; 
      c.moveToFirst(); 
      while(c.isAfterLast()==false) 
      { 

       byte[] bytes=c.getBlob(c.getColumnIndex("imageblob")); 

      array[i]=BitmapFactory.decodeByteArray(bytes, 0, 0); 
      c.moveToNext(); 
      i++; 
      } 
      Log.e("Bitmap length",""+array.length); 
     } 

passare questo Matrice bitmap su ListView

+0

questo è il modo per risparmiare la miniatura, non l'immagine di qualità completa ... –

+0

@Xylian Puoi ottenere una miniatura della foto catturata da Media. Controllare [questa risposta SO] (http://stackoverflow.com/a/8383411/792232) – Abhi

+0

non si dovrebbe salvare bitmap nel database SQLite .. Mai .. Basta fare riferimento all'immagine deve essere memorizzata in db .. – Ewoks

2

non sono convinto di salvare il bitmap se stesso in un database SQLite. Ma è possibile quando si usa Blob. Un BLOB ha bisogno di un byte [].

È possibile ottenere un array di byte salvando Bitmap (con compressione) e leggendo nuovamente il file. http://developer.android.com/reference/android/graphics/Bitmap.html

Bitmap b; 
File f = new File (...); 
FileOutputStream fs = new FileOutputStream (f); 
b.compress(JPEG, 85, fs); 
fs.close(); 
// Reread the file f into a byte [] 

o

Bitmap b; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
b.compress(JPEG, 85, baos); 
baos.close(); 
byte[] blob = baos.toByteArray(); 
b.compress(JPEG, 85, baos) 

Oppure si potrebbe serializzare l'bitmap in ByteArrayOutputStream (usando ObjectOutputStream)

Bitmap b; 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream (baos); 
oos.write (b); 
oos.close(); 
baos.close(); 
byte[] blob = baos.toByteArray(); 

Tuttavia, probabilmente senso per salvare il bitmap come file (JPG o PNG) perché potrebbero diventare di dimensioni maggiori. Il database manterrà solo le informazioni sul percorso di quell'immagine.

+0

@explain con un piccolo bit di codice .. – NagarjunaReddy

6

Ehi amici, ho t lui soluzione del problema di cui sopra. Qui pubblico il mio codice sorgente completo in modo che altri possano usare questa soluzione.

1.Creazione di un'acidità i.e CameraPictureAttività.

  public class CameraPictureActivity extends Activity { 
       Button addImage; 
       ArrayList<Contact> imageArry = new ArrayList<Contact>(); 
       ContactImageAdapter imageAdapter; 
       private static final int CAMERA_REQUEST = 1; 

       ListView dataList; 
       byte[] imageName; 
       int imageId; 
       Bitmap theImage; 
       DataBaseHandler db; 

       /** Called when the activity is first created. */ 
       @Override 
       public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        dataList = (ListView) findViewById(R.id.list); 
        /** 
        * create DatabaseHandler object 
        */ 
        db = new DataBaseHandler(this); 
        /** 
        * Reading and getting all records from database 
        */ 
        List<Contact> contacts = db.getAllContacts(); 
        for (Contact cn : contacts) { 
         String log = "ID:" + cn.getID() + " Name: " + cn.getName() 
           + " ,Image: " + cn.getImage(); 

         // Writing Contacts to log 
         Log.d("Result: ", log); 
         // add contacts data in arrayList 
         imageArry.add(cn); 

        } 
        /** 
        * Set Data base Item into listview 
        */ 
        imageAdapter = new ContactImageAdapter(this, R.layout.screen_list, 
          imageArry); 
        dataList.setAdapter(imageAdapter); 

        /** 
        * open dialog for choose camera 
        */ 

        final String[] option = new String[] {"Take from Camera"}; 
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
          android.R.layout.select_dialog_item, option); 
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 

        builder.setTitle("Select Option"); 
        builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int which) { 
          // TODO Auto-generated method stub 
          Log.e("Selected Item", String.valueOf(which)); 
          if (which == 0) { 
           callCamera(); 
          } 


         } 
        }); 
        final AlertDialog dialog = builder.create(); 

        addImage = (Button) findViewById(R.id.btnAdd); 

        addImage.setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
          dialog.show(); 
         } 
        }); 

       } 

       /** 
       * On activity result 
       */ 
       @Override 
       protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
        if (resultCode != RESULT_OK) 
         return; 

        switch (requestCode) { 
        case CAMERA_REQUEST: 

         Bundle extras = data.getExtras(); 

         if (extras != null) { 
          Bitmap yourImage = extras.getParcelable("data"); 
          // convert bitmap to byte 
          ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
          yourImage.compress(Bitmap.CompressFormat.PNG, 100, stream); 
          byte imageInByte[] = stream.toByteArray(); 

          // Inserting Contacts 
          Log.d("Insert: ", "Inserting .."); 
          db.addContact(new Contact("Android", imageInByte)); 
          Intent i = new Intent(CameraPictureActivity.this, 
            CameraPictureActivity.class); 
          startActivity(i); 
          finish(); 

         } 
         break; 
        } 
       } 

       /** 
       * open camera method 
       */ 
       public void callCamera() 
       { 
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
        startActivityForResult(intent, CAMERA_REQUEST); 
        intent.setType("image/*"); 
        intent.putExtra("crop", "true"); 
        intent.putExtra("aspectX", 0); 
        intent.putExtra("aspectY", 0); 
        intent.putExtra("outputX", 250); 
        intent.putExtra("outputY", 200); 
       } 
       } 

2.Creazione classe DataBaseHandler.

   public class DataBaseHandler extends SQLiteOpenHelper 
      { 

      // All Static variables 
      // Database Version 
      private static final int DATABASE_VERSION = 1; 

      // Database Name 
      private static final String DATABASE_NAME = " Camera_imagedb"; 

      // Contacts table name 
      private static final String TABLE_CONTACTS = " Camera_contacts"; 

      // Contacts Table Columns names 
      private static final String KEY_ID = "id"; 
      private static final String KEY_NAME = "name"; 
      private static final String KEY_IMAGE = "image"; 

      public DataBaseHandler(Context context) { 
       super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      } 

      // Creating Tables 
      @Override 
      public void onCreate(SQLiteDatabase db) { 
       String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
         + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
         + KEY_IMAGE + " BLOB" + ")"; 
       db.execSQL(CREATE_CONTACTS_TABLE); 
      } 

      // Upgrading database 
      @Override 
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
       // Drop older table if existed 
       db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS); 

       // Create tables again 
       onCreate(db); 
      } 

      /** 
      * All CRUD(Create, Read) Operations 
      */ 

      public// Adding new contact 
      void addContact(Contact contact) { 
       SQLiteDatabase db = this.getWritableDatabase(); 

       ContentValues values = new ContentValues(); 
       values.put(KEY_NAME, contact._name); // Contact Name 
       values.put(KEY_IMAGE, contact._image); // Contact Phone 

       // Inserting Row 
       db.insert(TABLE_CONTACTS, null, values); 
       db.close(); // Closing database connection 
      } 

      // Getting single contact 
      Contact getContact(int id) { 
       SQLiteDatabase db = this.getReadableDatabase(); 

       Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID, 
         KEY_NAME, KEY_IMAGE }, KEY_ID + "=?", 
         new String[] { String.valueOf(id) }, null, null, null, null); 
       if (cursor != null) 
        cursor.moveToFirst(); 

       Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), 
         cursor.getString(1), cursor.getBlob(1)); 

       // return contact 
       return contact; 

      } 

      // Getting All Contacts 
      public List<Contact> getAllContacts() { 
       List<Contact> contactList = new ArrayList<Contact>(); 
       // Select All Query 
       String selectQuery = "SELECT * FROM contacts ORDER BY name"; 

       SQLiteDatabase db = this.getWritableDatabase(); 
       Cursor cursor = db.rawQuery(selectQuery, null); 
       // looping through all rows and adding to list 
       if (cursor.moveToFirst()) { 
        do { 
         Contact contact = new Contact(); 
         contact.setID(Integer.parseInt(cursor.getString(0))); 
         contact.setName(cursor.getString(1)); 
         contact.setImage(cursor.getBlob(2)); 
         // Adding contact to list 
         contactList.add(contact); 
        } while (cursor.moveToNext()); 
       } 
       // close inserting data from database 
       db.close(); 
       // return contact list 
       return contactList; 
      } 
      } 

3.Create un'altra classe di contatto

 public class Contact 
     { 

      // private variables 
      int _id; 
      String _name; 
      byte[] _image; 

      // Empty constructor 
      public Contact() { 

      } 

      // constructor 
      public Contact(int keyId, String name, byte[] image) { 
       this._id = keyId; 
       this._name = name; 
       this._image = image; 

      } 
      public Contact(String name, byte[] image) { 
       this._name = name; 
       this._image = image; 

      } 
      public Contact(int keyId) { 
       this._id = keyId; 

      } 

      // getting ID 
      public int getID() { 
       return this._id; 
      } 

      // setting id 
      public void setID(int keyId) { 
       this._id = keyId; 
      } 

      // getting name 
      public String getName() { 
       return this._name; 
      } 

      // setting name 
      public void setName(String name) { 
       this._name = name; 
      } 

      // getting phone number 
      public byte[] getImage() { 
       return this._image; 
      } 

      // setting phone number 
      public void setImage(byte[] image) { 
       this._image = image; 
      } 
     } 

4.Create un adattatore cioè ContactImageAdapter

 public class ContactImageAdapter extends ArrayAdapter<Contact>{ 
      Context context; 
       int layoutResourceId; 
       // BcardImage data[] = null; 
       ArrayList<Contact> data=new ArrayList<Contact>(); 
       public ContactImageAdapter(Context context, int layoutResourceId, ArrayList<Contact> data) { 
        super(context, layoutResourceId, data); 
        this.layoutResourceId = layoutResourceId; 
        this.context = context; 
        this.data = data; 
       } 

       @Override 
       public View getView(int position, View convertView, ViewGroup parent) { 
        View row = convertView; 
        ImageHolder holder = null; 

        if(row == null) 
        { 
         LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
         row = inflater.inflate(layoutResourceId, parent, false); 

         holder = new ImageHolder(); 
         holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 
         holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
         row.setTag(holder); 
        } 
        else 
        { 
         holder = (ImageHolder)row.getTag(); 
        } 

        Contact picture = data.get(position); 
        holder.txtTitle.setText(picture._name); 
        //convert byte to bitmap take from contact class 

        byte[] outImage=picture._image; 
        ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage); 
        Bitmap theImage = BitmapFactory.decodeStream(imageStream); 
        holder.imgIcon.setImageBitmap(theImage); 
        return row; 

       } 

       static class ImageHolder 
       { 
        ImageView imgIcon; 
        TextView txtTitle; 
       } 
      } 

5.Infine creare il file XML principale e screen_list.

5,1 main.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="#ffffff" 
     android:orientation="vertical" > 

     <Button 
      android:id="@+id/btnAdd" 
      android:layout_width="fill_parent" 
      android:layout_height="60dp" 
      android:text="Add Image" /> 

     <ListView 
      android:id="@+id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.55" 
      android:cacheColorHint="#00000000" > 
     </ListView> 

    </LinearLayout> 

5.2 screen_list.xml

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:padding="10dp" > 

    <ImageView 
     android:id="@+id/imgIcon" 
     android:layout_width="200dp" 
     android:layout_height="200dp" 
     android:scaleType="fitXY" 
     android:gravity="center_vertical" /> 

    <TextView 
     android:id="@+id/txtTitle" 
     android:layout_width="80dp" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical" 
     android:textSize="14dp" 
     android:text="@string/hello" 
     android:textColor="#000000" 
     android:layout_marginLeft="7dp" /> 

</LinearLayout> 

6.Uso simile. enter image description here enter image description here

Problemi correlati