RenderScript:在支持库中不能有两个具有不同 SDK 版本的上下文

RenderScript: Can't have two contexts with different SDK versions in support lib

我试图使用 Android 支持 RenderScript 来制作位图模糊效果,但是在某些设备上测试时 (API 22) 我的应用程序崩溃并出现 "two contexts with different SDK versions" 错误。

很奇怪以前没人问过这个问题!

build.gradle

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        renderscriptTargetApi 18
        renderscriptSupportModeEnabled true
    }
}
dependencies {
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:support-vector-drawable:23.2.1'
compile 'com.android.support:support-annotations:23.2.1'
compile 'com.android.support:support-v13:23.2.1'
compile 'com.android.support:support-v4:23.2.1'
compile 'com.android.support:design:23.2.1'
compile 'com.android.support:palette-v7:23.2.1'
compile 'com.android.support:recyclerview-v7:23.2.1'
compile 'com.android.support:cardview-v7:23.2.1'

MainActivity.java

public Bitmap blurImage(Bitmap image) {
    final float BITMAP_SCALE = 0.4f;
    final float BLUR_RADIUS = 7.5f;
    int width = Math.round(image.getWidth() * BITMAP_SCALE);
    int height = Math.round(image.getHeight() * BITMAP_SCALE);
    Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
    RenderScript rs = RenderScript.create(context);
    ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
    Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
    theIntrinsic.setRadius(BLUR_RADIUS);
    theIntrinsic.setInput(tmpIn);
    theIntrinsic.forEach(tmpOut);
    tmpOut.copyTo(outputBitmap);
    return outputBitmap;
}

尝试执行此操作时崩溃:

RenderScript rs = RenderScript.create(context);

函数和位图都在同一个activity,我的问题是:是什么导致两个不同的上下文?

检查您的导入。您很可能在一个文件中导入 android.renderscript.RenderScript,在另一个文件中导入 android.support.v8.renderscript.RenderScript。上下文与您的应用程序上下文相关联,因此您的应用程序中只能有一个或另一个。

相关说明,如果上述方法在两个文件之间完全相同,我建议制作一个实用程序助手class,这样您的代码就只在一个地方。