Android摄像头捕获和保存

Android摄像头捕获和保存,android,mysql,jdbc,Android,Mysql,Jdbc,我已经创建了一个Android应用程序,它使用摄像头/多媒体资料捕捉图像并在ImageView中显示。很好用。 但是,我想使用JDBC将该图像保存在MySQL数据库中 我尝试将其转换为Base64字符串,当我尝试上载时,它在MySQL数据库表中返回null。 代码如下所示: protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(reque

我已经创建了一个Android应用程序,它使用摄像头/多媒体资料捕捉图像并在ImageView中显示。很好用。 但是,我想使用JDBC将该图像保存在MySQL数据库中

我尝试将其转换为Base64字符串,当我尝试上载时,它在MySQL数据库表中返回null。 代码如下所示:

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK  && null != data)
    {
        // getting the selected image, setting in imageview and converting it to byte and base 64
        progressBar.setVisibility(View.VISIBLE);
        Bitmap originBitmap = null;
        Uri selectedImage = data.getData();
        Toast.makeText(MainActivity.this, selectedImage.toString(), Toast.LENGTH_LONG).show();
        InputStream imageStream;
        try
        {
            imageStream = getContentResolver().openInputStream(selectedImage);
            originBitmap = BitmapFactory.decodeStream(imageStream);
        }
        catch (FileNotFoundException e)
        {
            System.out.println(e.getMessage().toString());
        }
        if (originBitmap != null)
        {
            this.imagebox.setImageBitmap(originBitmap);
            Log.w("Image Setted in", "Done Loading Image");
            try
            {
                Bitmap image = ((BitmapDrawable) imagebox.getDrawable()).getBitmap();
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                image.compress(Bitmap.CompressFormat.JPEG, 90, byteArrayOutputStream);
                byteArray = byteArrayOutputStream.toByteArray();
                encodedImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
                Txt.setText(encodedImage) ;
              // Calling the background process so that application wont slow down
                UploadImage uploadImage = new UploadImage();
              uploadImage.execute("");
                //End Calling the background process so that application wont slow down
                }
            catch (Exception e)
            {
                Log.w("OOooooooooo","exception");
            }
            Toast.makeText(MainActivity.this, "Conversion Done",Toast.LENGTH_SHORT).show();
        }
        // End getting the selected image, setting in imageview and converting it to byte and base 64
    }
    else
    {
        System.out.println("Error Occured");
    }
}

public class UploadImage extends AsyncTask<String,String,String>
{
    String S=Txt.getText().toString();
    String res = "";

    @Override
    protected void onPostExecute(String r)
    {
        // After successful insertion of image
        progressBar.setVisibility(View.GONE);
        Toast.makeText(MainActivity.this , res , Toast.LENGTH_LONG).show();
        // End After successful insertion of image
    }
    @Override
    protected String doInBackground(String... params)
    {
          String msg = "unknown";
        try
        {
           Class.forName("com.mysql.jdbc.Driver");
          Connection con = DriverManager.getConnection(url, user, pass);
           res="Success";
            String query = "INSERT INTO MYIMAGES (picturedata) values (?)";
            PreparedStatement preparedStatement = con.prepareStatement(query);
            preparedStatement.setString(1, S);
            int res = preparedStatement.executeUpdate();
             }
    catch (Exception e) {
    e.printStackTrace();
    String res = e.toString();
}
return res;
                
activityresult上受保护的void(int-requestCode、int-resultCode、Intent-data)
{
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RESULT\u LOAD\u IMAGE&&resultCode==RESULT\u OK&&null!=数据)
{
//获取所选图像,在imageview中设置并将其转换为字节和基数64
progressBar.setVisibility(View.VISIBLE);
位图originBitmap=null;
Uri selectedImage=data.getData();
Toast.makeText(MainActivity.this,选择edimage.toString(),Toast.LENGTH\u LONG.show();
输入流图像流;
尝试
{
imageStream=getContentResolver().openInputStream(SelecteImage);
originBitmap=BitmapFactory.decodeStream(imageStream);
}
catch(filenotfounde异常)
{
System.out.println(例如getMessage().toString());
}
if(originBitmap!=null)
{
this.imagebox.setImageBitmap(originBitmap);
Log.w(“在中设置图像”,“加载图像完成”);
尝试
{
位图图像=((BitmapDrawable)imagebox.getDrawable()).getBitmap();
ByteArrayOutputStream ByteArrayOutputStream=新建ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,90,byteArrayOutputStream);
byteArray=byteArrayOutputStream.toByteArray();
encodedImage=Base64.encodeToString(byteArray,Base64.DEFAULT);
Txt.setText(encodedImage);
//调用后台进程以便应用程序不会减慢速度
UploadImage UploadImage=新建UploadImage();
uploadImage.execute(“”);
//结束调用后台进程,这样应用程序就不会慢下来
}
捕获(例外e)
{
Log.w(“oooooo”,“exception”);
}
Toast.makeText(MainActivity.this,“转换完成”,Toast.LENGTH_SHORT.show();
}
//结束获取所选图像,在imageview中设置并将其转换为字节和基数64
}
其他的
{
System.out.println(“发生错误”);
}
}
公共类UploadImage扩展异步任务
{
字符串S=Txt.getText().toString();
字符串res=“”;
@凌驾
受保护的void onPostExecute(字符串r)
{
//成功插入图像后
progressBar.setVisibility(View.GONE);
Toast.makeText(MainActivity.this,res,Toast.LENGTH_LONG.show();
//成功插入图像后结束
}
@凌驾
受保护的字符串doInBackground(字符串…参数)
{
字符串msg=“未知”;
尝试
{
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=DriverManager.getConnection(url、用户、通行证);
res=“成功”;
String query=“插入MYIMAGES(picturedata)值(?”;
PreparedStatement PreparedStatement=con.prepareStatement(查询);
编制报表。设置字符串(1,S);
int res=preparedStatement.executeUpdate();
}
捕获(例外e){
e、 printStackTrace();
String res=e.toString();
}
返回res;

首先,尽量把下次发布的代码写得更好,因为很难读懂

第二,您的问题是AsyncTask中的这一行

String S=Txt.getText().toString(); 
Txt变量为null,因此您要插入null

您的asyncTask类应如下所示:

public class UploadImage extends AsyncTask<String,String,String> {
    String res = "";
@Override
protected void onPostExecute(String r) {
    // After successful insertion of image
    progressBar.setVisibility(View.GONE);
    Toast.makeText(MainActivity.this, res, Toast.LENGTH_LONG).show();
    // End After successful insertion of image
}

@Override
protected String doInBackground(String... params) {
    String msg = "unknown";
    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(url, user, pass);
        res = "Success";
        String query = "INSERT INTO MYIMAGES (picturedata) values (?)";
        PreparedStatement preparedStatement = con.prepareStatement(query);
        preparedStatement.setString(1, params[0]);
        int res = preparedStatement.executeUpdate();
    } catch (Exception e) {
        e.printStackTrace();
        String res = e.toString();
    }
    return res;

}
UploadImage uploadImage = new UploadImage(); 
uploadImage.execute(Txt.getText().toString())

像这样,您将此值传递给asyncTask,该任务将在与UI一起工作的主线程不同的线程上工作。

您能阅读您发布的代码吗?为了回答正确的问题,您应该阅读该部分,然后编辑此问题。谢谢。工作正常。是否有其他选项保存图像在Mysql BLOB列中使用le,而不是使用相同的jdbc转换为base64字符串。@RubinaPareen Mysql没有任何直接存储图像的方法,因此,是的,您唯一的方法是将图像转换为base64字符串并保存。我更喜欢其他解决方案,我通常将图像作为文件存储在服务器中(可能使用php Web服务)然后在我的BBDD中存储指向这个图像的URL。你应该考虑它。顺便说一下,如果我的答案解决了你的问题,请考虑将答案选为这个问题的答案,谢谢!我没有为此存储代码,这是另外一个问题。这是一个演示如何执行此操作的教程: