我在我的项目中使用zbar扫描仪库。更新到sdk 23后,棉花糖扫描仪不工作。下面是gradle文件。如果我设置targetSdkVersion以外的任何东西,扫描仪正在工作。
下面是gradle文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 15
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "net.sourceforge.zbar.android.CameraTest"
minSdkVersion 9
targetSdkVersion 23
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile files('libs/zbar.jar')
}
下面是我得到异常日志的唯一一行:
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: FATAL EXCEPTION: main
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: Process: net.sourceforge.zbar.android.CameraTest, PID: 7719
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/net.sourceforge.zbar.android.CameraTest-2/lib/arm/libiconv.so: has text relocations
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at java.lang.Runtime.loadLibrary(Runtime.java:372)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at java.lang.System.loadLibrary(System.java:1076)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at net.sourceforge.zbar.android.CameraTest.CameraTestActivity.<clinit>(CameraTestActivity.java:54)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at java.lang.Class.newInstance(Native Method)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.app.ActivityThread.-wrap11(ActivityThread.java)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.os.Looper.loop(Looper.java:148)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5417)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
10-15 21:19:00.682 7719-7719/? E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
10-15 21:19:00.688 804-6706/? W/ActivityManager: Force finishing activity net.sourceforge.zbar.android.CameraTest/.CameraTestActivity
10-15 21:19:00.700 9581-9650/? E/Surface: getSlotFromBufferLocked: unknown buffer: 0x9664a7f0
如何解决这个问题有帮助吗?我想使用目标sdk 23来处理相机权限,按照新的棉花糖功能。
代码中用于加载库的行如下:
static {
System.loadLibrary("iconv");
}
对我有效的解决方案是@Arst在上述答案的评论中提到的,下载jniLibs文件夹并从这里将其放入您的应用程序中。我还替换了zbar.jar.
你的应用程序崩溃了,原因如下:
https://developer.android.com/about/versions/marshmallow/android - 6.0 - changes.html
这个版本更新了动态链接器的行为。动态链接器现在可以理解库的名称与其路径之间的区别(公共bug 6670),并且现在实现了按名称进行搜索。以前运行的应用程序有坏的DT_NEEDED条目(通常是构建机文件系统上的绝对路径)可能会在加载时失败。
dlopen(3) RTLD_LOCAL标志现在被正确实现了。请注意,RTLD_LOCAL是默认的,所以没有显式使用RTLD_LOCAL的dlopen(3)调用将受到影响(除非你的应用显式使用RTLD_GLOBAL)。对于RTLD_LOCAL,符号将不能被稍后调用dlopen(3)加载的库使用(而不是被DT_NEEDED项引用)。
在以前的Android版本中,如果你的应用程序请求系统加载带有文本重定位的共享库,系统会显示警告,但仍然允许加载库。从这个版本开始,如果你的应用的目标SDK版本是23或更高,系统会拒绝这个库。为了帮助您检测库是否加载失败,您的应用程序应该记录dlopen(3)失败,并包含dlerror(3)调用返回的问题描述文本。要了解有关处理文本重定位的更多信息,请参阅本指南。
解决方案:在你的android项目中创建一个文件夹lib,创建一个名为armeabi-v7a的文件夹,把你的。so文件放在里面。然后通过system.load(context.)nativellibrarydir + File。
试试这个QRCodeReader android api 23 (6.0 Marshmallow)这很好。根据要求添加相机权限。https://github.com/dlazaro66/QRCodeReaderView
公共类DecoderActivity扩展Activity实现OnQRCodeReadListener {
private TextView myTextView;
private QRCodeReaderView mydecoderview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_decoder);
mydecoderview = (QRCodeReaderView) findViewById(R.id.qrdecoderview);
mydecoderview.setOnQRCodeReadListener(this);
myTextView = (TextView) findViewById(R.id.exampleTextView);
}
// Called when a QR is decoded
// "text" : the text encoded in QR
// "points" : points where QR control points are placed
@Override
public void onQRCodeRead(String text, PointF[] points) {
myTextView.setText(text);
}
// Called when your device have no camera
@Override
public void cameraNotFound() {
}
// Called when there's no QR codes in the camera preview image
@Override
public void QRCodeNotFoundOnCamImage() {
}
@Override
protected void onResume() {
super.onResume();
mydecoderview.getCameraManager().startPreview();
}
@Override
protected void onPause() {
super.onPause();
mydecoderview.getCameraManager().stopPreview();
}
}