この特別なトピックに関する何百もの質問を見つけることができますが、私はそれらのほとんどを読みましたが、役に立ちませんでした. スタック トレースは次のとおりです。
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:573)
at PACKAGE.MyApp.getPhoto(MyApp.java:191)
at PACKAGE.MyApp.getEntries(MyApp.java:149)
at PACKAGE.AlarmSetup.createNotifications(AlarmSetup.java:48)
at PACKAGE.AlarmSetup.onHandleIntent(AlarmSetup.java:30)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.os.HandlerThread.run(HandlerThread.java:60)
ここで Stack Overflow に関する多くの質問を読んだ後、Java 関数を最適化しましたが (少なくともそう思う)、この例外がスローされます。これが私のコードです:
public Bitmap getContactPhoto(String lookup_key) {
Uri lookUpUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookup_key);
Uri contentUri = ContactsContract.Contacts.lookupContact(ctx.getContentResolver(), lookUpUri);
try {
final int REQUIRED_SIZE = 144;
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true; // first get only the size of the image
BitmapFactory.decodeStream(ContactsContract.Contacts.openContactPhotoInputStream(ctx.getContentResolver(), contentUri), null, o);
int scale = 1;
while ((o.outWidth/scale/2) >= REQUIRED_SIZE && (o.outHeight/scale/2) >= REQUIRED_SIZE) {
scale *= 2;
}
BitmapFactory.Options oScaled = new BitmapFactory.Options();
oScaled.inSampleSize = scale; // decode with calculated sample size now
oScaled.inPurgeable = true; // prevent OutOfMemory
oScaled.inInputShareable = true; // prevent OutOfMemory
return BitmapFactory.decodeStream(ContactsContract.Contacts.openContactPhotoInputStream(ctx.getContentResolver(), contentUri), null, oScaled);
}
catch (Exception e) {
return null;
}
}
手伝って頂けますか?私は必死になって、多くの改善を試みました。前もって感謝します!