Android: как сделать снимок с камеры и преобразовать растровое изображение в байтовый массив и сохранить в sqlite db? - PullRequest
2 голосов
/ 23 октября 2011

Я все еще довольно новичок в Android и все еще пытаюсь выяснить, как сохранить изображение в БД SQLite. Как и я пытаюсь вызвать камеру с событием нажатия кнопки, чтобы сделать фотографию, а по возвращении я пытаюсь сохранить ее в базе данных в виде большого двоичного объекта. Я понимаю, что это может быть не лучшим способом, и с учетом сказанного я не знаю, как это сделать. Ультималей, что мне нужно сделать, - это получить доступ к камере с помощью моего приложения, разрешить ей делать фотографии и иметь возможность сохранять фотографию в базе данных. До сих пор я видел несколько форумов, где люди предлагали взять возвращенное растровое изображение, преобразовать его в байтовый массив и просто сохранить. Это было бы хорошо, но я снова в растерянности, любая помощь будет принята с благодарностью. Вот код, который я сейчас использую:

//---Pressing this button will call the built in Camera---
    Button b4 = (Button) findViewById(R.id.btn_addPhotos);
    b4.setOnClickListener(new OnClickListener()
    {

        public void onClick(View arg0){

            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);  

            //startActivity(cameraIntent);  
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);  
        }

    });

вот метод onActivityResult ():

protected void onActivityResult(int requestCode, int resultCode, Intent data){
   if (resultCode == Activity.RESULT_CANCELED)
   {
       //handles when camera was canceled...
       Toast.makeText(this, "Camera was cancelled by user...", Toast.LENGTH_LONG).show();

   } else if (resultCode == Activity.RESULT_OK)
   {

       Bitmap imageReturned = (Bitmap) data.getExtras().get("data");

       db.open();
       boolean id = db.insertImage(AssessmentID, imageReturned, "test");
               db.close();

       //displays message, if successful...
       displayMessage(id); 

   };
};

Вот мой метод вставки класса базы данных:

 //---insert image into the database---
    public boolean insertImage(String AssessmentID, Bitmap picture, String name)//, String sub, String parcel, String lot, String elevation, String datum) 
    {
        boolean num = false;
        try
        {
                db.execSQL("insert into storedImages values(" + AssessmentID + ", " + picture + ", " + name + ");");
                num = true;
                //getting null pointer when trying to insert....
        }catch(SQLException e)
        {
            e.printStackTrace();
            num = false;
        };

            //returns true if successful and false if not...
        return num;
    }

вот ошибка logcat:

10-23 15:10:51.890: ERROR/NvOmxCameraSettingsparser(89): Param type 13 not supported
10-23 15:10:51.890: ERROR/NvOmxCameraSettingsparser(89): Param type 49 not supported
10-23 15:10:52.200: ERROR/ImagerODM-OV5650(89): SetParameter(): 32 not supported
10-23 15:10:57.510: ERROR/NvOmxCamera(89): Already called release()
10-23 15:11:08.020: ERROR/AndroidRuntime(10123): FATAL EXCEPTION: main
10-23 15:11:08.020: ERROR/AndroidRuntime(10123): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1337, result=-1, data=Intent { act=inline-data (has extras) }} to activity {king.chad.SDE/king.chad.SDE.NewResidentialActivity}: java.lang.NullPointerException
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2818)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2861)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.app.ActivityThread.access$1000(ActivityThread.java:122)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1054)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.os.Looper.loop(Looper.java:132)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.app.ActivityThread.main(ActivityThread.java:4123)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at java.lang.reflect.Method.invokeNative(Native Method)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at java.lang.reflect.Method.invoke(Method.java:491)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at dalvik.system.NativeStart.main(Native Method)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123): Caused by: java.lang.NullPointerException
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at king.chad.SDE.DBAdapter.insertImage(DBAdapter.java:406)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at king.chad.SDE.NewResidentialActivity.onActivityResult(NewResidentialActivity.java:168)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.app.Activity.dispatchActivityResult(Activity.java:4581)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2814)
10-23 15:11:08.020: ERROR/AndroidRuntime(10123):     ... 11 more

Ответы [ 3 ]

2 голосов
/ 24 октября 2011

Обычно вы не сохраняете двоичные данные в базе данных. Это считается дурным тоном и может заставить запросы к базе данных занимать очень много времени из-за способа хранения данных на диске. Что вы должны сделать, это сохранить путь к файлу изображения в вашей базе данных и сохранить изображение на SD-карте.

Без написания огромного количества кода для вас, вот пример высокого уровня. Сначала создайте таблицу для хранения изображения с помощью следующего вызова sql:

CREATE TABLE images (_id INTEGER PRIMARY KEY AUTOICREMENT, file_path TEXT, name TEXT);

Когда приходит время вставить изображение, вы должны сделать две вещи. Сначала запишите изображение на SD-карту. Следуйте инструкциям здесь , чтобы сделать это. После того, как вы выписали его и получили для него имя файла, вы просто делаете запрос sql следующим образом:

INSERT INTO images (file_path, name) VALUES ("your file path", "name of image");

Всякий раз, когда вам действительно нужно отобразить изображение, вы просто читаете файл, указанный в file_path, с вашей SD-карты.

0 голосов
/ 24 октября 2011

Используйте getPixels (), чтобы извлечь данные пикселей из растрового изображения и сохранить массив int как большой двоичный объект в базе данных (хотя я бы порекомендовал обычный файл).

JavaOCR Project имеет демоверсии Android, выполняющие что-то похожее: http://sourceforge.net/projects/javaocr/

0 голосов
/ 24 октября 2011

Прежде всего, похоже, что Bitmap не переопределяет конструктор toString() по умолчанию, поэтому вы не можете получить какие-либо значимые данные из ..." + picture + ".... Вы должны обратить внимание на изменение изображения в массив пикселей, вызвав picture.getPixels и сохранив его вместо этого. Вам нужно будет изменить столбец изображения вашей базы данных на тип BLOB. Кроме того, вы получаете исключение нулевого указателя в вашем методе вставки, что может указывать на то, что db равно нулю. Не могли бы вы опубликовать строку 406 из вашего класса DBAdapter?

...