Программный снимок экрана на Android: setDrawingCacheEnabled создает исключение CalledFromWrongThreadException - PullRequest
1 голос
/ 16 июля 2011

Я столкнулся с проблемой при попытке вызвать content.setDrawingCacheEnabled (true) в одном из моих тестов robotium.Когда я пытаюсь включить кэш чертежа в контексте, я иногда получаю CalledFromWrongThreadException.Кажется, это происходит только при работе на эмуляторе.Когда я пытаюсь это сделать на устройстве (Samsung S2), оно работает каждый раз ...

Вот код

Функция вызова:

String screnshotName = String.format("SS_Cities_%s.png", s);
File ssDir = Environment.getExternalStorageDirectory();
TestUtilities.takeScreenShot(solo.getCurrentActivity(), ssDir, screnshotName);

Функция снимка экрана (которая выдает исключение):

public static void takeScreenShot(Activity activity, File Directory, String FileName) throws Exception {
    View content = activity.findViewById(R.id.content);

    ***// This is a horrible hack that i want to get rid of***
    // Occasiaonally setDrawingCacheEnabled throws a CalledFromWrongThreadException
    int MAX_RETRIES = 10;
    for(int i = 0; i < MAX_RETRIES; i++)
    {
        try{
            content.setDrawingCacheEnabled(true);
            continue;
        }
        catch (Exception e){}

    }

    content.buildDrawingCache();
    Bitmap b = content.getDrawingCache();
    File outputFile = new File(Directory.toString() + "/" + FileName);

    try {
        if (!Directory.exists()) {
            Directory.mkdirs();
        }
        if (!Directory.canWrite()) {
            throw new Exception("Directory not writable");
        }

        FileOutputStream fos = new FileOutputStream(outputFile);

        if (fos != null) {
            b.compress(Bitmap.CompressFormat.PNG, 90, fos);
            fos.close();
        }
    } catch (Exception e) {
        String screenshotError = String.format("Error taking screenshot: %s", e.toString());
        throw new Exception(screenshotError);
    }
}

Разрешения, установленные в приложении, я нахожусьтестирование:

<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Ответы [ 2 ]

1 голос
/ 15 ноября 2011

Эмулятор Android не всегда хорошо работает с внешним хранилищем. Вот почему вы можете получить эти ошибки. Поэтому я предлагаю, чтобы всякий раз, когда вы хотите протестировать приложения, использующие внешнее хранилище, вы делаете это на реальном устройстве, поскольку у вас не будет всех «нефиксированных» ошибок, которые все еще возникают у эмулятора.

0 голосов
/ 30 ноября 2012

Я не вижу, выполняете ли вы свой метод takeScreenShot из UIThread или нет, но, насколько я вижу, я думаю, что на ваш вопрос здесь отвечают:

Переполнение стека: CalledFromWrongThreadException

...