BitmapFactory.decodeFile и ImageView странная вещь в Android

У меня странная проблема - это происходит на xperia (android 4.0.3), а не на samsung S plus (2.3.6). В приложении я использую Google Maps APIv2 с библиотекой поддержки (в другом упражнении. Не уверен, если имеет значение).

Я думаю, что я сузил проблему до:

private Bitmap bitmap;
private String st;
private static final String PHOTO_DIR = "photodir";

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    [...]
    st = Environment.getExternalStorageDirectory().toString() + "/" + PHOTO_DIR  + "/test.jpg";
    bitmap = BitmapFactory.decodeFile(st);
    ImageView im = (ImageView) findViewById(R.id.imv_Photo);
    im.setImageBitmap(bitmap);
    [...]

Это работает как ожидалось. Но это:

@Override
public void onClick(View v)
{
    try
    {
        ImageView im = (ImageView) findViewById(R.id.imv_Photo);
        String st = Environment.getExternalStorageDirectory().toString() + "/" + PHOTO_DIR  + "/test1.jpg";
        Bitmap bitmap = BitmapFactory.decodeFile(st);
        im.setImageBitmap(bitmap);
    }
    catch (Exception e)
    {
        // null
    }
}

зависает приложение (несмотря на блок try / catch!) даже с удаленным im.setImageBitmap(bitmap). Когда я закомментирую BitmapFactory.decodeFile проблема исчезнет. Что еще хуже, xperia отключает SD-карту при подключении к USB, и я пока не знаю, как записать фотографии в память телефона, поэтому я не могу проверить журнал (кстати: есть ли способ получить журнал позже?)

Когда я удаляю код из onCreate (), onClick () работает ровно один раз. Я пытался установить bitmap = null и setImageBitmap(null) перед декодированием, но это не помогает.

Это кажется мне очень странным, поскольку у Samsung нет проблем с тем же кодом.

Есть какое-то решение или, может быть, я делаю что-то не так?

1 ответ

Решение

Сделай одну вещь. Перед передачей для декодирования файла сэмплируйте изображение. Проверьте код ниже

BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 3;


Bitmap bitmap = BitmapFactory.decodeFile(st,options);
    im.setImageBitmap(bitmap);
Другие вопросы по тегам