title: Retrieving sqlite blob field to put into imageview
body: <p>I'm having problems trying to retrieve a blob from my sqlite database and setting it as a bitmap in the imageview that is a layout that my listview uses. The text from the database is fine but I get an error when I try to set the imageview to the bitmap that has been read in from the database. Here is the code: </p>
  
  <pre><code>import java.io.ByteArrayInputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.InputStream;
  import java.util.ArrayList;
  import java.util.List;
  
  import android.app.Activity;
  import android.content.*;
  import android.database.Cursor;
  import android.graphics.Bitmap;
  import android.graphics.Bitmap.CompressFormat;
  import android.graphics.BitmapFactory;
  import android.os.Bundle;
  import android.speech.RecognizerIntent;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.view.Window;
  import android.widget.*;
  import android.widget.TabHost.TabSpec;
  
  
  public class StudentTrackerActivity extends Activity implements OnClickListener {
  
      final static int cameraData = 0;
      private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
      private static final int REQUEST_CODE = 192837; 
      private static final String BUFF_INFO = null;
      public byte[] imgByte = null;
      public final Bitmap imgBitmap = null;
      public ImageView imgPic; 
      public ImageButton imgCamera;
      public ImageView imgSpeaker;
      public ImageView imgIcon;
  
      public Bitmap bm;
      public Intent i;
      public ByteArrayOutputStream out =  new ByteArrayOutputStream(128);
      InputStream is;
      StringBuffer sb; 
      Button btnAddStudentRecord;
  
      boolean bRecordAdded = true;
  
      public ListView list;
      public EditText txtStudentName;
      public EditText txtDOB;
      public EditText txtAddress1;
      public EditText txtAddress2;
      public EditText txtTown;
      public EditText txtPostcode;
      public EditText txtPhone;
  
      public TextView txtFname;
      public TextView txtDateOfBirth; 
  
      public String strStudentName;
      public String strDOB;
      public String strAddress1;
      public String strAddress2;
      public String strTown; 
      public String strPostcode;
      public String strPhone;
  
      public String strMatches;
      public List&lt;String&gt; results = new ArrayList&lt;String&gt;();
  
      @SuppressWarnings({ "unchecked", "rawtypes" })
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          requestWindowFeature(Window.FEATURE_NO_TITLE);
  
          setContentView(R.layout.main);
  
          sb = new StringBuffer();
          imgCamera = (ImageButton) findViewById(R.id.imgCamera);
          imgPic = (ImageView) findViewById(R.id.imgPic);
          imgSpeaker = (ImageView) findViewById(R.id.imgSpeaker);
          imgIcon = (ImageView) findViewById(R.id.icon);
          btnAddStudentRecord = (Button) findViewById(R.id.btnAddStudentRecord);
  
          txtStudentName = (EditText) findViewById(R.id.txtStudentName);
          txtDOB = (EditText) findViewById(R.id.txtDOB);
          txtAddress1 = (EditText) findViewById(R.id.txtAddress1);
          txtAddress2 = (EditText) findViewById(R.id.txtAddress2);
          txtTown = (EditText) findViewById(R.id.txtTown);       
          txtPostcode = (EditText) findViewById(R.id.txtPostcode);
          txtPhone = (EditText) findViewById(R.id.txtPhone);
  
          txtFname = (TextView) findViewById(R.id.txtFname);
         // txtDateOfBirth = (TextView) findViewById(R.id.txtDateOfBirth);
  
          list = (ListView) findViewById(R.id.list);
  
          //convert edit text values to string values
          strStudentName = txtStudentName.getText().toString();
          strDOB = txtDOB.getText().toString(); 
          strAddress1 = txtAddress1.getText().toString();
          strAddress2 = txtAddress2.getText().toString(); 
          strTown= txtTown.getText().toString(); 
          strPostcode = txtPostcode.getText().toString();
          strPhone = txtPhone.getText().toString();
  
  
  
  
          TabHost th = (TabHost) findViewById(R.id.tabhost);
          th.setup();
          TabSpec specs = th.newTabSpec("tag1");
          specs.setContent(R.id.tab1);
          specs.setIndicator("", getResources().getDrawable(R.drawable.student));
          th.addTab(specs);
  
          specs = th.newTabSpec("tag2");
          specs.setContent(R.id.tab2);
          specs.setIndicator("", getResources().getDrawable(R.drawable.camera));
          th.addTab(specs);
  
          specs = th.newTabSpec("tag3");
          specs.setContent(R.id.tab3);
          specs.setIndicator("Tab3");
          th.addTab(specs);
  
          specs = th.newTabSpec("tag4");
          specs.setContent(R.id.tab4);
          specs.setIndicator("Search", getResources().getDrawable(R.drawable.magnify));
          th.addTab(specs);
  
         //set listener for speaker button 
          imgSpeaker.setOnClickListener(new SpeakerButtonHandler());
  
         //set listener for camera button 
         imgCamera.setOnClickListener(this);
  
         //set listener for add student button 
         btnAddStudentRecord.setOnClickListener(new AddStuButtonHandler());
  
         //make silhouette default image
         is = getResources().openRawResource(R.drawable.silhouette);
         bm = BitmapFactory.decodeStream(is);
  
         //display students in listview
         DisplayaAllStudents();
  
  
  
  
      }
  
      public void onClick(View v) {
  
        int vNum = v.getId();
  
        switch(vNum){
  
        case R.id.imgCamera:
  
            //capture photo of student
            i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(i, cameraData);
  
            break;
  
  
        }
  
      }
  
         private void startVoiceRecognitionActivity() {
              Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
              intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
              //intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");
              startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
          }
  
         public void flushBuffer(){
  
             sb.delete(0, sb.length());
  
         }
  
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  
          super.onActivityResult(requestCode, resultCode, data);
  
          try{
  
  
              if(resultCode == RESULT_OK){
  
                   Bundle extras = data.getExtras();
                   bm = (Bitmap)extras.get("data");
                   imgPic.setImageBitmap(bm);
  
  
              }
  
                if (requestCode == VOICE_RECOGNITION_REQUEST_CODE &amp;&amp; resultCode == RESULT_OK) {
                      // Fill the list view with the strings the recognizer thought it could have heard
                      ArrayList&lt;String&gt; matches = data.getStringArrayListExtra(
                              RecognizerIntent.EXTRA_RESULTS);
  
                      //add text to string buffer and display 
                      //it on notepad
  
                      //flush string buffer of previous content
                      flushBuffer();
  
                      //remove square brackets
                      strMatches = matches.toString().replace("[","").replace("]", "");
  
                      //add string to string buffer
                      sb.append(strMatches.toString() + "\n");
  
                      //check which edit text field has the 
                      //focus then populate the field with the
                      //contents of the voice recognition string
  
                      if(txtStudentName.isFocused()){
  
                      txtStudentName.setText(sb.toString());
  
                      }
                      else if(txtDOB.isFocused()){
  
                      txtDOB.setText(sb.toString());
  
                      }
                      else if(txtAddress1.isFocused()){
  
                          txtAddress1.setText(sb.toString());
  
                      }
  
                      else if(txtAddress2.isFocused()){
  
                          txtAddress2.setText(sb.toString());
  
                      } 
  
                      else if(txtTown.isFocused()){
  
                          txtTown.setText(sb.toString());
  
                       }
  
                      else if(txtPostcode.isFocused()){
  
                          txtPostcode.setText(sb.toString());
                       }  
  
                      else if(txtPhone.isFocused()){
  
                          txtPhone.setText(sb.toString());
                       }
  
              }
  
          }catch(Exception ex){
  
  
              ex.printStackTrace();
          }
      }
  
      private class AddStuButtonHandler implements OnClickListener{
  
  
          public void onClick(View v) {
  
              if(v.getId() == R.id.btnAddStudentRecord){
  
                  addRecord();
  
                  //DisplayaAllStudents();
                  //Toast.makeText(getApplicationContext(), "Testing!!!", Toast.LENGTH_SHORT).show();
              }
  
  
          }
  
  
  
  
  
      }
  
      public void addRecord(){
  
          DBAdapter db = new DBAdapter(this);
  
          db.open();
          long id;
          //prepare and compress bitmap for database insert       
          bm.compress(CompressFormat.PNG, 100, out);
  
          id = db.insertStudent(txtStudentName.getText().toString(),
                  txtDOB.getText().toString(),
                  txtAddress1.getText().toString(),
                  txtAddress2.getText().toString(),
                  txtTown.getText().toString(),
                  txtPostcode.getText().toString(),
                  txtPhone.getText().toString(),
                  out.toByteArray()
  
                  );
  
          if(bRecordAdded){
  
              Toast.makeText(getApplicationContext(), "Record successfully added", Toast.LENGTH_SHORT).show();
          }else{
  
              Toast.makeText(getApplicationContext(), "Error: could not add record", Toast.LENGTH_SHORT).show();
  
          }
  
          db.close();
  
      }
  
      @SuppressWarnings("unchecked")
      public void DisplayaAllStudents(){
  
           DBAdapter db = new DBAdapter(this);
  
           db.open();
  
           Cursor c = db.getAllStudents();
  
           if(c.moveToFirst()){
  
               do{
  
                   String stuName = c.getString(c.getColumnIndex(db.KEY_STUDENTNAME));
                   String stuDOB = c.getString(c.getColumnIndex(db.KEY_DOB));
  
                   results.add(" " + stuName.toString() + ", D.O.B: " + stuDOB);
                   //read image from database and insert into image view
                   imgByte = c.getBlob(8);
                   ByteArrayInputStream is = new ByteArrayInputStream(imgByte);
  
                   Bitmap picBitmap = BitmapFactory.decodeStream(is);
                   imgIcon.setImageBitmap(picBitmap);
  
  
                   //display record
                   //DisplayStudent(c);
               }while(c.moveToNext());
           }
          //bind data to list view
           list.setAdapter(new ArrayAdapter&lt;String&gt;(StudentTrackerActivity.this,R.layout.datalayout,R.id.txtFname,results));
  
           db.close();
      }
  
      public void DisplayStudent(Cursor c){
  
          Toast.makeText(getApplicationContext(),
  
                  "StudentName: " + c.getString(1) + "\n" +
                  "D.O.B:" + c.getString(2) + "\n" +
                  "Address1: " + c.getString(3) + "\n" +
                  "Address2: " + c.getString(4) + "\n" +
                  "Town: " + c.getString(5) + "\n" +
                  "Postcode: " + c.getString(6) + "\n" +
                  "Phone: " + c.getString(7) + "\n" +
                  "Pic: " + c.getBlob(8)
                  ,
                  Toast.LENGTH_LONG).show();
  
      }
  
  
  
     private class SpeakerButtonHandler implements OnClickListener{
  
  
      public void onClick(View v) {
  
  
          if(v.getId() == R.id.imgSpeaker){
  
              startVoiceRecognitionActivity();
  
  
          }
  
       }
  
  
  
    }
  
  }
  </code></pre>
  
  <hr>
  
  <pre><code>11-17 13:22:58.506: INFO/System.out(25430): waiting for debugger to settle...
  11-17 13:22:58.707: INFO/System.out(25430): waiting for debugger to settle...
  11-17 13:22:58.907: INFO/System.out(25430): waiting for debugger to settle...
  11-17 13:22:59.109: INFO/System.out(25430): debugger has settled (1463)
  11-17 13:22:59.307: ERROR/gralloc(126): [unregister] handle 0x393b98 still locked (state=40000001)
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): updateAllElements
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): updateTime
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): setCalendarInstance
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): onTimeChanged
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): mHour01HandIndex = 1
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): mHour01HandIndex = 3
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): mHour01HandIndex = 2
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): mHour01HandIndex = 3
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): updateTime id = 3
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): updateCurrentTemperature
  11-17 13:23:00.127: INFO/WeatherClockWidgetProvider(5101): changeFtoC
  11-17 13:23:00.137: INFO/WeatherClockWidgetProvider(5101): updateCurrentLocal
  11-17 13:23:00.147: INFO/WeatherClockWidgetProvider(5101): updateTemperatures
  11-17 13:23:00.147: INFO/WeatherClockWidgetProvider(5101): setCalendarInstance
  11-17 13:23:00.177: INFO/WeatherClockWidgetProvider(5101): highT = 60
  11-17 13:23:00.177: INFO/WeatherClockWidgetProvider(5101): lowT = 47
  11-17 13:23:00.177: INFO/WeatherClockWidgetProvider(5101): changeFtoC
  11-17 13:23:00.197: INFO/WeatherClockWidgetProvider(5101): changeFtoC
  11-17 13:23:00.197: INFO/WeatherClockWidgetProvider(5101): updateDate
  11-17 13:23:00.197: INFO/WeatherClockWidgetProvider(5101): setCalendarInstance
  11-17 13:23:00.207: INFO/WeatherClockWidgetProvider(5101): updateWeatherDescription
  11-17 13:23:00.207: INFO/WeatherClockWidgetProvider(5101): updateUpdatedTime
  11-17 13:23:00.207: INFO/WeatherClockWidgetProvider(5101): setCalendarInstance
  11-17 13:23:00.207: ERROR/updateUpdatedTime dateString(5101): 11/13/2011
  11-17 13:23:00.237: ERROR/updatedTime before(5101):  Update: NOV.13 4:14 PM
  11-17 13:23:00.237: ERROR/updatedTime end(5101):  Update: NOV.13 4:14 PM
  11-17 13:23:00.297: INFO/WeatherClockWidgetProvider(5101): bindViews
  11-17 13:23:00.297: INFO/WeatherClockWidgetProvider(5101): appWidgetId = 3
  11-17 13:23:03.157: WARN/wpa_supplicant(189): Failed to initiate AP scan.
  11-17 13:23:05.517: WARN/ActivityManager(126): Launch timeout has expired, giving up wake lock!
  11-17 13:23:05.777: WARN/ActivityManager(126): Activity idle timeout for HistoryRecord{447ec880 com.StudentTracker/.StudentTrackerActivity}
  11-17 13:23:07.467: WARN/GDataClient(126): Unable to execute HTTP request.java.net.UnknownHostException: Host is unresolved: android.clients.google.com:443
  11-17 13:23:09.161: WARN/wpa_supplicant(189): Failed to initiate AP scan.
  11-17 13:23:15.162: WARN/wpa_supplicant(189): Failed to initiate AP scan.
  </code></pre>
  
  <hr>
  
  <p>Stack trace:</p>
  
  <pre><code>StudentTracker_Debug [Android Application]  
      DalvikVM[localhost:8603]    
          Thread [&lt;3&gt; main] (Suspended (exception RuntimeException))  
              ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2496  
              ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2512   
              ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 119 
              ActivityThread$H.handleMessage(Message) line: 1863  
              ActivityThread$H(Handler).dispatchMessage(Message) line: 99 
              Looper.loop() line: 123 
              ActivityThread.main(String[]) line: 4363    
              Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
              Method.invoke(Object, Object...) line: 521  
              ZygoteInit$MethodAndArgsCaller.run() line: 860  
              ZygoteInit.main(String[]) line: 618 
              NativeStart.main(String[]) line: not available [native method]  
  </code></pre>