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,这样您的代码就只在一个地方。
我试图使用 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,这样您的代码就只在一个地方。