0

Possible Duplicate:
nullpointer exception raises when i click on the button

case R.id.Button01check:
            startActivity(new Intent (SaveData.this,CheckData.class));
            break;  

this is my CheckData.java

 public class CheckData extends ListActivity  {     
TextView selection;
DataManipulator dm;
private DataManipulator DataManipulator;

    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.check);
    dm = new DataManipulator(this);

    LinearLayout layout = new LinearLayout(this);
    ImageView image = new ImageView(this);
    DataManipulator = new DataManipulator(this);

    Certificates testCertificates = new Certificates(BitmapFactory.decodeFile(Context.STORAGE_SERVICE));

    DataManipulator.open();
    DataManipulator.createCertificatesEntry( (Certificates) testCertificates);
    DataManipulator.close(); 

    testCertificates = null;

    DataManipulator.open();
    testCertificates = DataManipulator.getFirstCertificatesFromDB();
    DataManipulator.close();

    image.setImageBitmap(((Certificates) testCertificates).getBitmap());

    setContentView(layout);
}

} this is line 29 DataManipulator.createCertificatesEntry( (Certificates) testCertificates);

this is my DataManipulator.java

    public class DataManipulator {
public static final String KEY_IMG = "image";

 private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private static final String DATABASE_NAME = "DBtest";
    private static final int DATABASE_VERSION = 1;

    private static final String CERTIFICATES_TABLE = "certificates";

    private static final String CREATE_CERTIFICATES_TABLE = "create table "+CERTIFICATES_TABLE+" (" +KEY_IMG+" blob not null) ";

    private final Context mCtx;
    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_CERTIFICATES_TABLE);
        }

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS "+CERTIFICATES_TABLE);
            onCreate(db);
        }
    }
    public void Reset() { mDbHelper.onUpgrade(this.mDb, 1, 1); }

    public DataManipulator(Context ctx) {
        mCtx = ctx;
        mDbHelper = new DatabaseHelper(mCtx);
    }

    public DataManipulator open() throws SQLException {
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() { mDbHelper.close(); }

    public void createCertificatesEntry(Certificates certificates) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        certificates.getBitmap().compress(Bitmap.CompressFormat.PNG, 100, out);
        ContentValues cv = new ContentValues();
        cv.put(KEY_IMG, out.toByteArray());
        mDb.insert(CERTIFICATES_TABLE,  null, cv);
    }
    public Certificates getFirstCertificatesFromDB() throws SQLException {
        Cursor cur = mDb.query(true, CERTIFICATES_TABLE,  new String[] {KEY_IMG}, null, null, null, null, null, null);
        if(cur.moveToFirst()) {
            byte[] blob = cur.getBlob(cur.getColumnIndex(KEY_IMG));
            ByteArrayInputStream inputStream = new ByteArrayInputStream(blob);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            cur.close();
            return new Certificates(bitmap);
        }
        cur.close();
        return null;
    }    
}

this is line 60 certificates.getBitmap().compress(Bitmap.CompressFormat.PNG, 100, out);

this is my logcat output

06-04 11:09:41.824: E/AndroidRuntime(693): FATAL EXCEPTION: main
06-04 11:09:41.824: E/AndroidRuntime(693): java.lang.RuntimeException: Unable to start activity ComponentInfo{list.certificates/list.certificates.CheckData}: java.lang.NullPointerException
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.os.Looper.loop(Looper.java:137)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.main(ActivityThread.java:4340)
06-04 11:09:41.824: E/AndroidRuntime(693):  at java.lang.reflect.Method.invokeNative(Native Method)
06-04 11:09:41.824: E/AndroidRuntime(693):  at java.lang.reflect.Method.invoke(Method.java:511)
06-04 11:09:41.824: E/AndroidRuntime(693):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-04 11:09:41.824: E/AndroidRuntime(693):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-04 11:09:41.824: E/AndroidRuntime(693):  at dalvik.system.NativeStart.main(Native Method)
06-04 11:09:41.824: E/AndroidRuntime(693): Caused by: java.lang.NullPointerException
06-04 11:09:41.824: E/AndroidRuntime(693):  at list.certificates.DataManipulator.createCertificatesEntry(DataManipulator.java:60)
06-04 11:09:41.824: E/AndroidRuntime(693):  at list.certificates.CheckData.onCreate(CheckData.java:29)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.Activity.performCreate(Activity.java:4465)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-04 11:09:41.824: E/AndroidRuntime(693):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
06-04 11:09:41.824: E/AndroidRuntime(693):  ... 11 more
Community
  • 1
  • 1
samsun
  • 37
  • 1
  • 9

1 Answers1

1

In your case...all I can say either your certificates variable or certificates.getBitmap() api is returning null.

Certificates testCertificates = new Certificates(BitmapFactory.decodeFile(Context.STORAGE_SERVICE));

In above code decodeFile needs the complete path to the image. What you passing is not a complete path to the file. So from the above two cases certificates.getBitmap() is most probable cause of the exception. Context.STORAGE_SERVICE is not the full path to image.

Once you have the Uri for the image. Use the below code to get the image:

Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);

Certificates testCertificates = new Certificates(bmp);

DataManipulator.open();
DataManipulator.createCertificatesEntry( (Certificates) testCertificates);
DataManipulator.close(); 

Ref:

Images MediaStore

havexz
  • 9,550
  • 2
  • 33
  • 29
  • updated my whole code once check it out... – samsun Jun 04 '12 at 06:11
  • i am selecting image from gallery and saving it to database – samsun Jun 04 '12 at 06:27
  • may be but the code i put in the ans is not picking file from the gallery. It is just passing the wrong path value. – havexz Jun 04 '12 at 06:31
  • ok but is there any other way to do it – samsun Jun 04 '12 at 06:33
  • Add a button to your screen, which user will click to browse for image. Move the code above to the handler of the image browse button. Once you have the file name, use that. Thats all I can say, there is no short ans. – havexz Jun 04 '12 at 06:35
  • if (requestCode == PICK_FROM_FILE) { mImageCaptureUri = data.getData(); path = getRealPathFromURI(mImageCaptureUri); //from Gallery this is the path which i select images from gallery – samsun Jun 04 '12 at 06:36
  • i have added a button which picks images from gallery or sdcard – samsun Jun 04 '12 at 06:39
  • Just use the uri to get the Bitmap like `MediaStore.Images.Media.getBitmap` to load the bitmap from uri. – havexz Jun 04 '12 at 06:51