2017-11-02 9 views
-1

カメラとギャラリーから画像を保存し、sqliteデータベースに保存したいと思います。ここに私のコードです。カメラからデータベースに画像を保存サンプルアプリケーションで

public class MainActivity extends AppCompatActivity { 

private static final String TAG = MainActivity.class.getSimpleName(); 
private static final int GAL_CODE = 24; 
private static final int CAM_CODE = 31; 
private static final String ALLOW_KEY = "ALLOWED"; 
private static final String CAMERA_PREF = "camera_pref"; 

private ImageView imageView; 
private EditText nameET, addrET; 
private ImageButton galleryBtn, cameraBtn; 
private Button saveBtn; 

private String address; 
private String name; 

private DBHelper dbHelper; 
private boolean fromCamera = false; 
private boolean fromGallery = false; 
private Uri outputFileUri; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    dbHelper = new DBHelper(this); 

    imageView = (ImageView) findViewById(R.id.image); 
    nameET = (EditText) findViewById(R.id.nameET); 
    addrET = (EditText) findViewById(R.id.addrET); 
    galleryBtn = (ImageButton) findViewById(R.id.galleryBtn); 
    cameraBtn = (ImageButton) findViewById(R.id.cameraBtn); 
    saveBtn = (Button) findViewById(R.id.saveBtn); 

    galleryBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      selectImage(); 
     } 
    }); 

    cameraBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      takePhoto(); 
     } 
    }); 


    saveBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      saveUser(); 
     } 
    }); 

} 

private void takePhoto() { 

    File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyDir" + File.separator); 
    root.mkdirs(); 

    String fileName = "img_" + System.currentTimeMillis() + ".jpg"; 
    File sdCardImageMainDir = new File(root, fileName); 
    outputFileUri = Uri.fromFile(sdCardImageMainDir); 

    List<Intent> cameraIntents = new ArrayList<>(); 
    Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    PackageManager pm = getPackageManager(); 
    List<ResolveInfo> listCam = pm.queryIntentActivities(captureIntent, 0); 

    for (ResolveInfo info: listCam){ 
     String packageName = info.activityInfo.packageName; 
     Intent intent = new Intent(captureIntent); 
     intent.setComponent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name)); 
     intent.setPackage(packageName); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
     cameraIntents.add(intent); 
    } 
    startActivityForResult(captureIntent, CAM_CODE); 
} 

private void saveUser() { 

    name = nameET.getText().toString(); 
    address = addrET.getText().toString(); 

    if (!address.isEmpty() && !name.isEmpty()){ 
     User user = new User(name, address); 
     dbHelper.saveInputField(user); 
     dbHelper.close(); 
     startActivity(new Intent(MainActivity.this, ShowActivity.class)); 
    } 

} 

private void selectImage() { 
    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(intent, "Select Picture"), GAL_CODE); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == GAL_CODE && resultCode == RESULT_OK){ 
     Uri imgUri = data.getData(); 

     if (imgUri != null){ 
      if(saveImageToDB(imgUri)){ 
       Toast.makeText(this, "Saved Image", Toast.LENGTH_SHORT).show(); 
      } 

     } 

    } 

    if (requestCode == CAM_CODE && resultCode == RESULT_OK){ 
     Bitmap bitmap = (Bitmap) data.getExtras().get("data"); 
     if (bitmap != null){ 
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); 
      byte[] imageinByte = outputStream.toByteArray(); 

      User user = new User(name, address, imageinByte); 
      dbHelper.saveInputField(user); // error on this line 
     } 
    } 

} 

ここは私のモデルクラスです。

public class User { 

public int id; 
public String name; 
public String address; 
public byte[] image; 

public User() { 
} 

public User(int id) { 
    this.id = id; 
} 

public User(String name, String address, byte[] camImage) { 
    this.name = name; 
    this.address = address; 
    this.image = camImage; 
} 

public User(int id, String name, String address, byte[] camImage) { 
    this.id = id; 
    this.name = name; 
    this.address = address; 
    this.image = camImage; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

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

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

public byte[] getImage() { 
    return image; 
} 

public void setImage(byte[] image) { 
    this.image = image; 
} 
} 

マイデータベースヘルパークラスは次のとおりです。

public class DBHelper { 

private static final String DATABASE_NAME = "UsersDemo.db"; 
private static final int DATABASE_VERSION = 1; 
private static final String TABLE_NAME = "profileInfo"; 

private static final String COL_ID = "databaseId"; 
private static final String COL_NAME = "name"; 
private static final String COL_ADDRESS = "addr"; 
private static final String COL_IMAGE = "image"; 

private Context mCtx; 

private DatabaseManager databaseManager; 
private SQLiteDatabase db; 

public DBHelper (Context context){ 
    this.mCtx = context; 
    databaseManager = new DatabaseManager(mCtx); 
} 

public DBHelper open() throws SQLException{ 
    db = databaseManager.getWritableDatabase(); 
    return this; 
} 

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

public void saveInputField(User user){ 
    ContentValues values = new ContentValues(); 

    values.put(COL_NAME, user.getName()); 
    values.put(COL_ADDRESS, user.getAddress()); 
    values.put(COL_IMAGE, user.getImage()); 

    db.insert(TABLE_NAME, null, values); 
    db.close(); 
} 

public User getCurrentUser(int id){ 
    Cursor cursor = db.query(true, TABLE_NAME, new String[]{COL_ID, COL_NAME, COL_ADDRESS}, COL_ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null); 

    if (cursor != null && cursor.moveToFirst()){ 

     User user = new User(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getBlob(1)); 
     return user; 
    } 

    return null; 

} 

public void saveCamerayImage(byte[] imageBytes){ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_IMAGE, imageBytes); 
    db.insert(TABLE_NAME, null, contentValues); 
} 

public void saveGalleryImage(byte[] imageBytes){ 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_IMAGE, imageBytes); 
    db.insert(TABLE_NAME, null, contentValues); 
} 

public byte[] getImage(){ 
    Cursor cursor = db.query(true, TABLE_NAME, new String[]{COL_IMAGE,}, null, null, null, null, COL_ID + " DESC", "1"); 
    if (cursor.moveToFirst()){ 
     byte[] blob = cursor.getBlob(cursor.getColumnIndex(COL_IMAGE)); 
     cursor.close(); 
     return blob; 
    } 
    cursor.close(); 
    Toast.makeText(mCtx, "No Image Found", Toast.LENGTH_SHORT).show(); 
    return null; 
} 


public class DatabaseManager extends SQLiteOpenHelper { 

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

    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 
     String db_create = "Create Table " + TABLE_NAME + " (" 
       + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
       + COL_NAME + " TEXT, " 
       + COL_ADDRESS + " TEXT, " 
       + COL_IMAGE + " BLOB NOT NULL);"; 
     sqLiteDatabase.execSQL(db_create); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 
     sqLiteDatabase.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME); 
     onCreate(sqLiteDatabase); 
    } 

} 

}

アプリを実行している間、私は私のlogcatで、このエラーメッセージが表示されます。なぜそれがこれを示しているのか分かりません。

私のlogcatは以下の通りです:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference 
                     at com.joey.example.dbsqlite.DBHelper.saveInputField(DBHelper.java:53) 
                     at com.joey.example.dbsqlite.MainActivity.onActivityResult(MainActivity.java:170) 
                     at android.app.Activity.dispatchActivityResult(Activity.java:6919) 
                     at android.app.ActivityThread.deliverResults(ActivityThread.java:4184) 
                     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4231)  
                     at android.app.ActivityThread.-wrap20(ActivityThread.java)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)  
                     at android.os.Handler.dispatchMessage(Handler.java:110)  
                     at android.os.Looper.loop(Looper.java:203)  
                     at android.app.ActivityThread.main(ActivityThread.java:6269)  
                     at java.lang.reflect.Method.invoke(Native Method)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)  

誰かがこのエラーを解決する方法を説明できますか?ありがとう。

答えて

0

あなたはdbオブジェクトを使用してsaveInputField前にやって何も内部

db = databaseManager.getWritableDatabase(); 

を呼び出す必要があります。 db

+0

ありがとうございます。これで解決しました。再度、感謝します –

0

データベースへの書き込み中にメソッド内でopen()を呼び出すのを忘れた databaseManager.getWritableDatabase()は、データベースに書き込む権限を与えます。 method.Change sqliteのは悪い考えであると、この

public DBHelper open() throws SQLException { 
     db = databaseManager.getWritableDatabase(); 
     return this; 
    } 
0

保存イメージを呼び出し中

私もDBHelperのリターンを感じるが、あなたはまだ、さらに行きたいがあれば、必要とされていない、ここにありますコード

public static void insertPicture(byte[] data) 
{ 

SQLiteDatabase db = thisAct.openOrCreateDatabase(ConstantCodes.IMAGE_DATABASE, 2, null); 
ContentValues values = new ContentValues(1); 
values.put("photo", data); 
db.insert("photos", null, values); 
db.close(); 

} 

ハッピーコーディング!

+0

ありがとう、私はそれを修正しました。 –

関連する問題