android上的编程屏幕截图:setDrawingCacheEnabled引发CalledFromErrorThreadException

android上的编程屏幕截图:setDrawingCacheEnabled引发CalledFromErrorThreadException,android,testing,robotium,Android,Testing,Robotium,在我的一个robotium测试中尝试调用content.setDrawingCacheEnabled(true)时遇到问题。当我尝试在上下文中启用图形缓存时,有时会出现CalledFromErrorThreadException。这似乎只有在模拟器上运行时才会发生。当我在设备(三星S2)上试用时,它每次都能工作 这是密码 调用函数: 屏幕截图函数(引发异常): publicstaticvoidtakescreenshot(活动、文件目录、字符串文件名)引发异常{ 查看内容=activity.fi

在我的一个robotium测试中尝试调用content.setDrawingCacheEnabled(true)时遇到问题。当我尝试在上下文中启用图形缓存时,有时会出现CalledFromErrorThreadException。这似乎只有在模拟器上运行时才会发生。当我在设备(三星S2)上试用时,它每次都能工作

这是密码

调用函数:

屏幕截图函数(引发异常):

publicstaticvoidtakescreenshot(活动、文件目录、字符串文件名)引发异常{
查看内容=activity.findViewById(R.id.content);
***//这是一个可怕的黑客,我想摆脱***
//偶尔setDrawingCacheEnabled会引发CalledFromErrorThreadException
int MAX_RETRIES=10;
对于(int i=0;i
我正在测试的应用程序中设置的权限:



Android emulator在使用外部存储时并不总是能正常工作。这就是你可能会犯这些错误的原因。因此,我建议,每当你想测试使用外部存储的应用程序时,你都可以在真实的设备上进行测试,因为你不会有仿真器仍然存在的所有“未修复”错误。

Android仿真器并不总是能很好地使用外部存储。这就是你可能会犯这些错误的原因。因此,我建议,无论何时您想要测试使用外部存储的应用程序,您都可以在真实的设备中进行测试,因为您不会有仿真器仍然存在的所有“未修复”错误。

我看不出您是否可以从UIThread执行takeScreenShot方法,但据我所知,我认为您的问题已经在这里得到了回答:


我看不出您是否从UIThread执行takeScreenShot方法,但据我所知,我认为您的问题在这里得到了回答:

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"/>