Java 在android中将照片插入数据库时出现空指针异常
我是android的初学者,我正在制作一个在sqlite数据库中插入数据的应用程序,我在将记录添加到数据库时遇到了空指针异常 此代码从imageview获取pic,并将其转换为位图,然后转换为字节以保存它 有没有建议避免这个例外 这是密码Java 在android中将照片插入数据库时出现空指针异常,java,android,sqlite,bitmap,Java,Android,Sqlite,Bitmap,我是android的初学者,我正在制作一个在sqlite数据库中插入数据的应用程序,我在将记录添加到数据库时遇到了空指针异常 此代码从imageview获取pic,并将其转换为位图,然后转换为字节以保存它 有没有建议避免这个例外 这是密码 imageView1.setDrawingCacheEnabled(true); imageView1.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNS
imageView1.setDrawingCacheEnabled(true);
imageView1.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
imageView1.layout(0, 0, imageView1.getMeasuredWidth(), imageView1.getMeasuredHeight());
imageView1.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(imageView1.getDrawingCache());
imageView1.setDrawingCacheEnabled(false);
save_picture=loginDataBaseAdapter.getBytes(b);
loginDataBaseAdapter.insertEntry(userName, password, save_picture);
Toast.makeText(getApplicationContext(), "Record created ", Toast.LENGTH_LONG).show();`}
有一种将位图转换为字节的方法
// convert from bitmap to byte array
public byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, stream);
return stream.toByteArray();
}
还有插入法
public void insertEntry(String userName,String password , byte[] photo )
{
ContentValues newValues = new ContentValues();
// Assign values for each row.
newValues.put("USERNAME", userName);
newValues.put("PASSWORD",password);
newValues.put("Photo", photo);
// Insert the row into your table
db.insert("LOGIN", null, newValues);
}
还有数据库的创建
static final String DATABASE_CREATE = "create table "+"LOGIN"+
"( " +"ID"+" integer primary key autoincrement,"+ "USERNAME text,PASSWORD text, Photo blob not null); ";
感谢使用此类将位图转换为byteArray:
public class Utility {
// convert from bitmap to byte array
public static byte[] getBytes(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, stream);
return stream.toByteArray();
}
// convert from byte array to bitmap
public static Bitmap getPhoto(byte[] image) {
return BitmapFactory.decodeByteArray(image, 0, image.length);
}
}
和插入法:
newValues.put(G_PHOTO, Utility.getBytes(image));
尝试以base64格式字符串保存位图,然后将其插入数据库。 因此,您的getBytes方法将是getBase64Picture,如下所示:
public String getBase64StrFromPicture(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0, stream);
String imageEncoded = Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT);
return imageEncoded;
}
然后,为了检索图片,在查询之后,您可以使用反向过程,即将字符串化的图片转换为位图
public Bitmap getBitmapFromBase64Str(){
byte[] decodedString = Base64.decode(encodedImage, Base64.URL_SAFE);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
return decodedByte;
}
因为getDrawingCache总是返回null,所以会出现null指针异常 为了避免这个错误,我使用这个方法
public static Bitmap loadBitmapFromView(View v) {
Bitmap bi = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bi);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return bi;
}
感谢您的指导:我们能看到错误输出吗?可能重复的E/AndroidRuntime15303:致命异常:主E/AndroidRuntime15303:java.lang.NullPointerException E/AndroidRuntime15303:at android.graphics.Bitmap.createBitmapBitmap.java:571 E/AndroidRuntime15303:atcom.techblogon.loginexample.SignUPActivity$1.onClickSignUPActivity.java:91 E/AndroidRuntime15303:at android.view.view.performClickView.java:2532错误如下