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

时间:2016-06-24 14:29:27

标签: android renderscript

我尝试使用Android支持RenderScript来制作带有位图的模糊效果,但在某些设备(API 22)上进行测试时,我的应用程序崩溃时出现“带有不同SDK版本的两个上下文”错误。

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

的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);

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

1 个答案:

答案 0 :(得分:2)

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

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