我尝试使用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);
函数和位图都在同一个活动中,我的问题是:是什么导致两个不同的上下文?
答案 0 :(得分:2)
检查您的进口商品。您最有可能在一个文件中导入android.renderscript.RenderScript
,在另一个文件中导入android.support.v8.renderscript.RenderScript
。上下文与您的应用程序上下文相关联,因此应用程序中只能有一个或另一个。
在相关的说明中,如果上述方法在两个文件之间完全相同,我建议制作一个实用程序助手类,这样你的代码只能放在一个地方。