我必须在项目中使用QR扫描仪:
目前我正在使用QRCodeReaderView:
但是这个库的问题是:
我得到
java.lang.RuntimeException: 無法連接到相機服務 Exception
在Android 6.0中,如本问题所述:Android 6.0 RuntimeException:无法连接到相机服务
正如在那里的答案中所建议的那样,我试图将目标SDK版本降级到22,但效果很好。
但我无法在Playstore中更新我的应用程序,因为它拒绝我使用较低的目标SDK版本更新应用程序。
我还试图运行相同的QRCodeReaderView的演示应用程序,它也在我的Marshmallow设备中崩溃。如这里给出的。我还试图自己编译html" target="_blank">github中的代码,但还是崩溃了。
我试着寻找其他一些二维码阅读器,但他们似乎把“Marshmallow许可”放在了待办事项列表中。
那么,您能否建议任何可以很好地使用Marshmallow权限的库,或者提供有关使用同一库的帮助?
好吧,我使用QrCode一个,它在所有设备中都运行良好。
<uses-permission android:name="android.permission.CAMERA" />
我的Gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.1"
defaultConfig {
applicationId "com.gujrat.quiz.qrcodereader"
minSdkVersion 16
targetSdkVersion 24
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.1.1'
compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha5'
compile 'me.dm7.barcodescanner:zxing:1.8.4'
compile 'cn.pedant.sweetalert:library:1.3'
compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
compile 'com.android.support:recyclerview-v7:24.0.+'
testCompile 'junit:junit:4.12'
}
请看一下阅读按钮和权限
package com.gujrat.quiz.qrcodereader;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.activeandroid.query.Select;
import com.activeandroid.query.Update;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class MenuActivity extends AppCompatActivity {
private String[] qrDescription = {"01234", "56789", "02468", "13579"};
private static final int MY_REQUEST_CODE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
Button read = (Button) findViewById(R.id.read);
Button show = (Button) findViewById(R.id.show);
Button clear= (Button) findViewById(R.id.clear);
if (getAll().size() == 0) {
saveInitialDataToDatabase();
} else {
// Toast.makeText(this, getAll().size() + "", Toast.LENGTH_SHORT).show();
}
read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.CAMERA},
MY_REQUEST_CODE);
} else {
startActivity(new Intent(MenuActivity.this, MainActivity.class));
}
} else {
startActivity(new Intent(MenuActivity.this, MainActivity.class));
}
}
});
show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MenuActivity.this, ShowReadQrCodeActivity.class));
}
});
clear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
List<QRDataHelper> scannedProductList = getAlreadyScannedList();
for (int i = 0; i < scannedProductList.size(); i++) {
updateDatabase(scannedProductList.get(i));
}
Toast.makeText(MenuActivity.this, "List Cleared", Toast.LENGTH_SHORT).show();
}catch (Exception e){
Toast.makeText(MenuActivity.this, "List Empty", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Now user should be able to use camera
startActivity(new Intent(MenuActivity.this, MainActivity.class));
} else {
// Your app will not have this permission. Turn off all functions
// that require this permission or it will force close like your
// original question
}
}
}
private void saveInitialDataToDatabase() {
try {
for (int i = 0; i < qrDescription.length; i++) {
QRDataHelper qrDataHelper = new QRDataHelper();
qrDataHelper.setProduct_id(i + "");
qrDataHelper.setProduct_description(qrDescription[i]);
qrDataHelper.setProduct_used("0");
qrDataHelper.save();
}
} finally {
//
}
}
public static List<QRDataHelper> getAll() {
return new Select()
.from(QRDataHelper.class)
.where("1")
.execute();
}
public static List<QRDataHelper> getAlreadyScannedList() {
return new Select()
.from(QRDataHelper.class)
.where("product_used = 1")
.execute();
}
public static void updateDatabase(QRDataHelper qrDataHelper) {
new Update(QRDataHelper.class)
.set("product_used = 0")
.where("product_id = ?", qrDataHelper.getProduct_id())
.execute();
}
}
调用QrReaderFragment的活动
package com.gujrat.quiz.qrcodereader;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
openFragment(new ScannerFragment());
}
public void openFragment(Fragment fragment) {
FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction();
ft.replace(R.id.container,
fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commitAllowingStateLoss();
}
}
和你的 QrCodeReader 片段
package com.gujrat.quiz.qrcodereader;
import android.media.AudioManager;
import android.media.ToneGenerator;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.activeandroid.query.Select;
import com.activeandroid.query.Update;
import com.google.zxing.Result;
import java.util.List;
import cn.pedant.SweetAlert.SweetAlertDialog;
import me.dm7.barcodescanner.zxing.ZXingScannerView;
public class ScannerFragment extends MasterFragment implements ZXingScannerView.ResultHandler {
private static final String TAG = ScannerFragment.class.getSimpleName();
private String mReadText;
private ZXingScannerView mScannerView;
public ScannerFragment() {
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mScannerView = new ZXingScannerView(getActivity()); // Programmatically initialize the scanner view
return mScannerView;
}
@Override
public void onResume() {
super.onResume();
mScannerView.setResultHandler(this);
mScannerView.startCamera();
}
@Override
public void handleResult(Result rawResult) {
mReadText = rawResult.getText();
Log.v(TAG, "qrcode rawresult: " + rawResult.getText()); // Prints scan results
Log.v(TAG, "qrcode format: " + rawResult.getBarcodeFormat().toString()); // Prints the scan format (qrcode, pdf417 etc.)
}
private void showSuccessDialog() {
SweetAlertDialog dialog = new SweetAlertDialog(mContext, SweetAlertDialog.SUCCESS_TYPE)
.setTitleText("Done!")
.setContentText("Thank you for using service")
.setCancelText("Exit!")
.setConfirmText("Use again!")
.showCancelButton(true)
.setCancelClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sDialog) {
sDialog.dismiss();
getActivity().finish();
}
})
.setConfirmClickListener(new SweetAlertDialog.OnSweetClickListener() {
@Override
public void onClick(SweetAlertDialog sweetAlertDialog) {
sweetAlertDialog.dismiss();
resumeScanView();
}
});
dialog.setCancelable(false);
dialog.show();
}
private void resumeScanView() {
mReadText = "";
// Note:
// * Wait 2 seconds to resume the preview.
// * On older devices continuously stopping and resuming camera preview can result in freezing the app.
// * I don't know why this is the case but I don't have the time to figure out.
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
mScannerView.resumeCameraPreview(ScannerFragment.this);
}
}, 2000);
}
private void startBeepSound() {
ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 100);
toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);
}
@Override
public void onPause() {
super.onPause();
mScannerView.stopCamera();
}
}
我用编译的'me.dm7.barcodescanner: zstar: 1.8.4'将Zstar qr scanner添加到我的android项目中。 我在片段内部显示二维码扫描仪。我可以毫无问题地扫描和阅读。我遇到的问题是试图在相机扫描时打开闪光灯(手电筒)。 这段代码扫描得很好 这个密码完美地开启了火炬 如果我尝试打开灯并返回mScannerview,扫描仪可以工作,但灯熄灭了。我似乎无法成功
问题内容: 试图使用像ZXing,ZBar和它们的fork之类的几个库,但是找不到从相机而不是从文件扫描条形码的方法。 有人可以指出我正确的方向吗?最好是我正在研究ZXing:如何从文件(而不是相机)扫描图像。 请。 问题答案: 最后,我找到了解决方案。代码是(源自此处): Gradle引用为: 用法:
我正在为我的客户开发一个android应用程序,他要求在应用程序中内置QR扫描仪。所以,我不希望用户不得不从GooglePlay下载另一个应用程序。换句话说,我不想从我的应用程序调用另一个QR扫描仪应用程序。我需要QR扫描仪内置在我的应用程序中。 我在github和这里的stackoverflow上读到了关于ZXing的信息。据我所知,将其QR扫描仪集成到应用程序中不是一个好主意。最好通过Inte
问题内容: 我的Java作业有问题。我遇到了意外的异常,特别是: java.util.NoSuchElementException:找不到行 我正在使用,该程序不断读取任何内容,并重复“无效格式”异常文本。如果输入正确的值,则第一部分通过,然后该部分立即进入此异常。如果输入的值不正确,则它将开始循环异常。 这是我的代码: 问题答案: 您关闭了多个库,这些库关闭了底层库,因此另一个库将不再从同一库和
问题内容: 使用Scanner类中的useDelimiter时遇到一些问题。 如果我有这个输入 美国广播公司 输出将是 AB 然后等到我键入另一个“-”以打印出最后一个字符 但是,如果我没有用户输入数据,而是将字符串插入到Scanner中,则代码将起作用。原因是什么?如何解决?我不想使用StringTokenzier 问题答案: 如果没有等待您输入另一个,则将错误地假定您已完成输入。 我的意思是,
我做了一个程序,要求3个整数来输出三角形的类型。所有内容都成功运行和编译,但是,在要求用户查看是否要再次循环的部分,联机编译器会输出错误: 异常线程"main"java.util.NoSuchElement异常在java.util.Scanner.throwFor(Scanner.java:838)在java.util.Scanner.next(Scanner.java:1347)在Assignm