Android摄像头捕获和保存
我已经创建了一个Android应用程序,它使用摄像头/多媒体资料捕捉图像并在ImageView中显示。很好用。 但是,我想使用JDBC将该图像保存在MySQL数据库中 我尝试将其转换为Base64字符串,当我尝试上载时,它在MySQL数据库表中返回null。 代码如下所示: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
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。你应该考虑它。顺便说一下,如果我的答案解决了你的问题,请考虑将答案选为这个问题的答案,谢谢!我没有为此存储代码,这是另外一个问题。这是一个演示如何执行此操作的教程: