Android SQLite:将照片作为Base64字符串获取并保存到数据库...然后检索

时间:2013-07-05 08:45:26

标签: android database image sqlite base64

我想针对新Android开发人员的常见问题开发一个完整的解决方案。我想创建一个教程和示例(供我自己和其他人遵循)在应用程序中拍照,然后将其保存到SQLite android数据库中的base64字符串。然后,我将能够在稍后阶段将此字符串上传到在线数据库,而不是我最初拍摄的JPG图像。

所以要重新迭代它必须......

  • 打开相机,
  • 拍摄图片
  • 另存为Base64字符串到SQLite DB

(之所以我需要将它作为字符串存储在DB中,是因为它将来会在某个时候上传到中央文档系统,并且大型JPG图像会很慢并且不理想,为什么DB中的Base64字符串会更好。我还想限制用户删除他们所采用的图像的可能性,这些图像将在DB中引用,应该只是参考文件的路径(这是替代方案 - 虽然我认为不太合适))

谢谢,我真的很期待着这个并开发一个其他人能够遵循的伟大解决方案。

我的努力如此......

我花了好几天时间研究这个问题,而且此刻我比开始时更困惑。关于这一点似乎有很多,但没有一步一步的部分可以遵循,关于什么线做什么,它来自哪里,做什么等等。所以首先,我想我可能需要打破这一点现在分成两个任务......

使用相机拍摄图像并以某种方式将文件作为输出...然后将其作为base64字符串保存到数据库或类似的东西。

我很欣赏通常将二进制数据存储到数据库中会导致查询缓慢而痛苦,但是由于只有少数图像会同时显示,所以我们不应该在这里遇到太多问题,并且SQLite查询很小。

首先,我关注Android: how to take picture with camera and convert bitmap to byte array and save to sqlite db?然而,本地保存图像并引用文件路径的说明真的不起作用。所以我几乎回到原点...

我一直在阅读http://developer.android.com/guide/topics/media/camera.html以了解相机...... confused.com !!!

公平地说,我已经阅读了这么多,现在理解得很少,我现在需要一个虚拟指南。希望我能忘掉我所读到的所有无用的废话,并从头开始......你的大脑格式/ F在哪里?

好的,我又开始了...... 现在事情变得更好了,我甚至添加了音频,但我不会进入那个。我的应用程序,拍摄照片,预览(使用标准相机意图),然后单击保存,在应用程序本地显示它。单击保存时,我需要将其作为blob / bit64保存到数据库,而不是显示图像

这是我的代码,所以你可以看到我在哪里......

尝试使用此作为拍摄图像的调用...

 <?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="vertical"
>
<ScrollView 
     android:layout_height="fill_parent"
android:layout_width="fill_parent" 
>

<LinearLayout 
android:layout_height="fill_parent"
android:layout_width="fill_parent" 
android:orientation="vertical">
>
<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Inspection ID" />

<EditText
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/txtName"
android:inputType="number"
android:maxLength="5"
android:digits="0123456789"
android:singleLine="true"
/>

<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Text1" />

<EditText
  android:id="@+id/txt1"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:autoText="false"
  android:gravity="top|left"
  android:lines="4"
  android:maxLines="4"
  android:minLines="4"
  android:scrollbars="vertical"
  android:singleLine="false"
  android:width="0dip" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Project Ref"

/>
<EditText
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/txtAge"
android:inputType="number"
android:maxLength="5"
android:digits="0123456789"
android:singleLine="true"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Drop Down"
/>

<Spinner
  android:id="@+id/spinDept"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" />

<Button
  android:id="@+id/btnPhotoCamera"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="camera" />

<Button
  android:id="@+id/btnPhotoGallery"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:text="gallery" />


    <TextView
        android:id="@+id/lblDisplayImage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnCancel"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="below_this_text_image_will_be_displayed"
        android:textSize="13dp" />
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_below="@+id/lblDisplayImage"
        android:layout_centerInParent="true"
        android:layout_marginTop="10dp"
        android:gravity="bottom" >
        <!--
             <ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
        -->
        <ImageView
            android:id="@+id/imgDisplayImage"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:contentDescription="area_where_image_is_to_be_displayed" />
        <!-- </ScrollView> -->
    </RelativeLayout>

<Button
  android:id="@+id/btnAudio"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:onClick="btnAudio"
  android:text="Audio" />

<Button
  android:id="@+id/btnAdd"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:onClick="btnAddEmp_Click"
  android:text="Save Inspection" />

<Button
        android:id="@+id/btnCancel"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnPhotoGallery"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="19dp"
        android:text="Reset/Clear Form Data" />

<TextView
  android:id="@+id/txtEmps"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Number of Inspections on Device " />
</LinearLayout>
</ScrollView>
</LinearLayout>

使用以下.java

package mina.android.DatabaseDemo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.Spannable;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;
import com.AssentApp.V100.R;

public class AddEmployee extends Activity {
    EditText txtName;
    EditText txtAge;
    TextView txtEmps;
    DatabaseHelper dbHelper;
    Spinner spinDept;

   /** The Constant PICK_IMAGE. */
private static final int PICK_IMAGE = 0;

/** The Constant PICK_IMAGE_FROM_GALLERY. */
private static final int PICK_IMAGE_FROM_GALLERY = 1;

/** The btn cancel. */
private Button btnPhotoCamera,btnPhotoGallery,btnCancel;

/** The img view. */
private ImageView imgView;

/** The u. */
private Uri u;

/* (non-Javadoc)
 * @see android.app.Activity#onCreate(android.os.Bundle)
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.addemployee);

    txtName=(EditText)findViewById(R.id.txtName);
    txtAge=(EditText)findViewById(R.id.txtAge);
    txtEmps=(TextView)findViewById(R.id.txtEmps);
    spinDept=(Spinner)findViewById(R.id.spinDept);

    imgView=(ImageView)findViewById(R.id.imgDisplayImage);
    btnPhotoCamera=(Button)findViewById(R.id.btnPhotoCamera);
    btnPhotoGallery=(Button)findViewById(R.id.btnPhotoGallery);
    btnCancel=(Button)findViewById(R.id.btnCancel);

    btnPhotoCamera.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            Intent camera=new Intent();
            camera.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
            camera.putExtra("crop", "false");

            File f=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

            u = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"myFile.jpg"));
            camera.putExtra(MediaStore.EXTRA_OUTPUT, u);
            startActivityForResult(camera, PICK_IMAGE);
        }
    });

    btnPhotoGallery.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, PICK_IMAGE_FROM_GALLERY);
        }
    });

    btnCancel.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {

            Intent goStartUp=new Intent(AddEmployee.this, AddEmployee.class);
            goStartUp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(goStartUp);
            finish();
        }
    });
}

/* (non-Javadoc)
 * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    if (resultCode==RESULT_OK )
    {
        if(requestCode == PICK_IMAGE) {

            InputStream is=null;
            try {
                is = this.getContentResolver().openInputStream(u);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            Bitmap bmp=BitmapFactory.decodeStream(is);
            imgView.setImageBitmap(bmp);
            Log.i("Inside", "PICK_IMAGE");
        }

        if (requestCode == PICK_IMAGE_FROM_GALLERY) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = { MediaStore.Images.Media.DATA };
            Log.d("data",filePathColumn[0]);
            Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
            imgView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
            Log.i("Inside", "PICK_IMAGE_FROM_GALLERY");
        }
    }
}




public void onStart()
{
    try
    {
    super.onStart();
    dbHelper=new DatabaseHelper(this);
    txtEmps.setText(txtEmps.getText()+String.valueOf(dbHelper.getEmployeeCount()));

    Cursor c=dbHelper.getAllDepts();
    startManagingCursor(c);



    //SimpleCursorAdapter ca=new SimpleCursorAdapter(this,android.R.layout.simple_spinner_item, c, new String [] {DatabaseHelper.colDeptName}, new int []{android.R.id.text1});
    SimpleCursorAdapter ca=new SimpleCursorAdapter(this,R.layout.deptspinnerrow, c, new String [] {DatabaseHelper.colDeptName,"_id"}, new int []{R.id.txtDeptName});
    //ca.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinDept.setAdapter(ca);
    spinDept.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View selectedView,
                int position, long id) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });


    //never close cursor
    }
    catch(Exception ex)
    {
        CatchError(ex.toString());
    }
}

public void btnAddEmp_Click(View view)
{
    boolean ok=true;
    try
    {
        Spannable spn=txtAge.getText();
        String name=txtName.getText().toString();
        int age=Integer.valueOf(spn.toString());
        int deptID=Integer.valueOf((int)spinDept.getSelectedItemId());
        Employee emp=new Employee(name,age,deptID);

        dbHelper.AddEmployee(emp);

    }
    catch(Exception ex)
    {
        ok=false;
        CatchError(ex.toString());
    }
    finally
    {
        if(ok)
        {
            //NotifyEmpAdded();
            Alerts.ShowEmpAddedAlert(this);
            txtEmps.setText("Number of Inspections on Device "+String.valueOf(dbHelper.getEmployeeCount()));
        }
    }
}

void CatchError(String Exception)
{
    Dialog diag=new Dialog(this);
    diag.setTitle("Adding new Inspection");
    TextView txt=new TextView(this);
    txt.setText(Exception);
    diag.setContentView(txt);
    diag.show();
}

void NotifyEmpAdded()
{
    Dialog diag=new Dialog(this);
    diag.setTitle("Success");
    TextView txt=new TextView(this);
    txt.setText("Inspection Added Successfully");
    diag.setContentView(txt);
    diag.show();
    try {
        diag.wait(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        CatchError(e.toString());
    }
    diag.notify();
    diag.dismiss();
}


public void btnAudio(View view) 
{
Intent intent = new Intent(AddEmployee.this, AudioRecordTest.class);
startActivity(intent);
}

}

似乎可以解决问题,但现在我需要为DB部分编辑它。我需要保存它“通过将图像转换为Byte []然后在sqlite中保存为Blob” - 或者我相信......我这样做的第一步是什么?注意,我不希望它再显示图像视图,而是保存到具有唯一ID /整数的DB。

任何指针都会很棒!!

1 个答案:

答案 0 :(得分:0)

我不认为你可以使用base64来做,但是你可以通过将图像转换为Byte []然后在sqlite中保存为Blob来做到这一点。