I wrote an android app and so far it works perfect except for on one phone. It is the exact phone that I have with 2.2 on both phones and mine works perfect. The other phone is getting force close all the time but only when opening an activity that queries my image DB and tries to show a gallery. Every activity crashes in the same place, the viewimages. At first I thought it was the intent that was doing it but one of the activitys does not have the intent, it opens the images below the gallery. This works on the emulator, on my moto droid and on a few other different droids. Here is the code for the gallery and my bitmap decoder. The error is below that. If anyone can see anything that would make it crash I would really appreciate the help.
我写了一个android应用程序,到目前为止,除了在一个手机上,它是完美的。我的手机和我的手机都有2.2个完美的手机。另一款手机一直在关闭,但只有在打开一个查询我的图像DB并试图显示一个图库的活动时。每一场活动都在同一地点发生碰撞,那就是viewimages。一开始我以为是意图,但其中一个活动没有意图,它打开了画廊下面的图片。这在模拟器上,在我的moto droid上,以及其他一些不同的机器人上。这是图库的代码和我的位图解码器。误差在那下面。如果有人能看到任何能使它崩溃的东西,我会非常感激这些帮助。
public void viewimages() {
String [] proj={ImageProvider._ID, ImageProvider.IMAGE, ImageProvider.TABLENAME,
ImageProvider.ITEMID, ImageProvider.IMAGEDATE};
cursor = managedQuery(ImageProvider.CONTENT_URI,
proj,
ImageProvider.TABLENAME + "=" + "'" + Tablename + "'"
+ " and " + ImageProvider.ITEMID + "=" + "'" + ID + "'",
null,
ImageProvider.IMAGEDATE);
Line 182 -> column_index = cursor.getColumnIndex(ImageProvider._ID);
第182行-> column_index = cursor.getColumnIndex(ImageProvider._ID);
g = (Gallery) findViewById(R.id.gallery);
g.setAdapter(new ImageAdapter(this));
g.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
cursor.moveToPosition(position);
ImageID = cursor.getLong(column_index);
Intent i = new Intent(LivestockDetails.this, ImageViewer.class);
i.putExtra("id", ImageID);
startActivity(i);
}
});
}
private Bitmap decodeFile(String file){
Bitmap b = null;
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, o);
int scale = 1;
if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
scale = 2 ^ (int) Math.ceil(Math.log(IMAGE_MAX_SIZE / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5));
}
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
b = BitmapFactory.decodeFile(file, o2);
return b;
}
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
public ImageAdapter(Context c) {
mContext = c;
TypedArray a = obtainStyledAttributes(R.styleable.Gallery1);
mGalleryItemBackground = a.getResourceId(
R.styleable.Gallery1_android_galleryItemBackground, 0);
a.recycle();
}
public int getCount() {
return cursor.getCount();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
if (convertView == null) {
String [] proj={ImageProvider._ID, ImageProvider.IMAGE, ImageProvider.TABLENAME,
ImageProvider.ITEMID, ImageProvider.IMAGEDATE};
cursor = managedQuery(ImageProvider.CONTENT_URI,
proj,
ImageProvider.TABLENAME + "=" + "'" + Tablename + "'"
+ " and " + ImageProvider.ITEMID + "=" + "'" + ID + "'",
null,
ImageProvider.IMAGEDATE + " DESC");
column_path = cursor.getColumnIndex(ImageProvider.IMAGE);
column_index = cursor.getColumnIndex(ImageProvider._ID);
cursor.moveToPosition(position);
String filename = cursor.getString(column_path);
java.io.File file = new java.io.File(filename);
if(!file.exists()) {
ImageID = cursor.getLong(column_index);
getContentResolver().delete(ImageProvider.CONTENT_URI,
ImageProvider._ID + "=" + ImageID, null);
Toast.makeText(LivestockDetails.this,
"There are missing images. They have been removed from the database." ,
Toast.LENGTH_LONG).show();
viewimages();
}
else {
Bitmap bitmapOrg = null;
bitmapOrg = decodeFile(filename);
Matrix matrix = new Matrix();
matrix.postScale(scale,scale);
resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
bitmapOrg.getWidth(), bitmapOrg.getHeight(), matrix, true);
Drawable delete = i.getDrawable();
if(delete!= null) {
((BitmapDrawable)i.getDrawable()).getBitmap().recycle();
i.setImageBitmap(resizedBitmap);
}
else {
i.setImageBitmap(resizedBitmap);
}
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setLayoutParams(new Gallery.LayoutParams(240, 180));
i.setBackgroundResource(mGalleryItemBackground);
}
}
return i;
}
}
Here is the error
这是错误的
java.lang.RuntimeException: Unable to start activity ComponentInfo{myaquarium.logger/myaquarium.logger.LivestockDetails}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at myaquarium.logger.LivestockDetails.viewimages(LivestockDetails.java:182)
at myaquarium.logger.LivestockDetails.onCreate(LivestockDetails.java:71)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
... 11 more
1 个解决方案
#1
1
I finally figured it out. My content provider was screwed up. I have two app, one is for my testing and one is for publishing. I had the content provider for publishing pointing to my testing app so in the emulator it worked fine since the content provider was there but when someone purchsed my app the conntent provider was missing. If only the error report gave more info. When I replicated it on my emulator by uninstalling everything then only installing the main app the logcat told me ythe content provider could not be found. Thats why it was crashing on the cursor every time.
我终于想通了。我的内容提供商搞砸了。我有两个应用,一个是测试,一个是发布。我让内容提供者发布指向我的测试应用程序,所以在模拟器中它运行良好,因为内容提供程序在那里,但当有人购买我的应用时,conntent提供商就不见了。如果只是错误报告提供了更多的信息。当我在我的模拟器上复制它时,卸载了所有东西,然后只安装了主应用程序,logcat告诉我,内容提供者是找不到的。这就是为什么它每次都在游标上崩溃。
#1
1
I finally figured it out. My content provider was screwed up. I have two app, one is for my testing and one is for publishing. I had the content provider for publishing pointing to my testing app so in the emulator it worked fine since the content provider was there but when someone purchsed my app the conntent provider was missing. If only the error report gave more info. When I replicated it on my emulator by uninstalling everything then only installing the main app the logcat told me ythe content provider could not be found. Thats why it was crashing on the cursor every time.
我终于想通了。我的内容提供商搞砸了。我有两个应用,一个是测试,一个是发布。我让内容提供者发布指向我的测试应用程序,所以在模拟器中它运行良好,因为内容提供程序在那里,但当有人购买我的应用时,conntent提供商就不见了。如果只是错误报告提供了更多的信息。当我在我的模拟器上复制它时,卸载了所有东西,然后只安装了主应用程序,logcat告诉我,内容提供者是找不到的。这就是为什么它每次都在游标上崩溃。