android条码扫描器zxing崩溃
我找到了一个在我的android项目中实现条形码扫描仪zxing的解决方案 它工作正常,但我有一个问题 **问题** 为什么动作条下面有一条小黑线? 底部的三个触摸菜单图标上方也有相同的条纹 问题二 如果我触摸flash项目,有时它会工作,有时应用程序会崩溃 更新:只有在自动对焦打开且我触摸FLASH项目时,应用程序才会崩溃。关闭自动对焦-没有问题 我的解决方案:android条码扫描器zxing崩溃,android,android-fragments,barcode,zxing,barcode-scanner,Android,Android Fragments,Barcode,Zxing,Barcode Scanner,我找到了一个在我的android项目中实现条形码扫描仪zxing的解决方案 它工作正常,但我有一个问题 **问题** 为什么动作条下面有一条小黑线? 底部的三个触摸菜单图标上方也有相同的条纹 问题二 如果我触摸flash项目,有时它会工作,有时应用程序会崩溃 更新:只有在自动对焦打开且我触摸FLASH项目时,应用程序才会崩溃。关闭自动对焦-没有问题 我的解决方案: if (mAutoFocus == true) { mScannerView.setAutoFoc
if (mAutoFocus == true) {
mScannerView.setAutoFocus(false);
mScannerView.setFlash(mFlash);
mScannerView.setAutoFocus(true);
} else {
mScannerView.setFlash(mFlash);
}
崩溃后的日志:
AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: setParameters failed
at android.hardware.Camera.native_setParameters(Native Method)
at android.hardware.Camera.setParameters(Camera.java:1551)
at me.dm7.barcodescanner.core.BarcodeScannerView.setFlash(BarcodeScannerView.java:118)
at me.dm7.barcodescanner.zxing.sample.ScannerFragment.onOptionsItemSelected(ScannerFragment.java:87)
at android.support.v4.app.Fragment.performOptionsItemSelected(Fragment.java:2070)
at android.support.v4.app.FragmentManagerImpl.dispatchOptionsItemSelected(FragmentManager.java:2159)
at android.support.v4.app.FragmentController.dispatchOptionsItemSelected(FragmentController.java:295)
at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:367)
at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:147)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:100)
at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:68)
at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:172)
at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:760)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:948)
at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:618)
at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:139)
at android.view.View.performClick(View.java:4421)
at android.view.View$PerformClick.run(View.java:17903)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:213)
at android.app.ActivityThread.main(ActivityThread.java:5225)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
这是我的密码:
扫描仪碎片活动
public class ScannerFragmentActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.barcode_scanner);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.barcode_scanner, menu);
return true;
}
}
扫描片段
public class ScannerFragment extends Fragment implements ZXingScannerView.ResultHandler {
private static final String FLASH_STATE = "FLASH_STATE";
private static final String AUTO_FOCUS_STATE = "AUTO_FOCUS_STATE";
private static final String SELECTED_FORMATS = "SELECTED_FORMATS";
private static final String CAMERA_ID = "CAMERA_ID";
private ZXingScannerView mScannerView;
private boolean mFlash;
private boolean mAutoFocus;
private ArrayList<Integer> mSelectedIndices;
private int mCameraId = -1;
MenuItem FlashOn;
MenuItem FlashOff;
MenuItem AutoFocusOn;
MenuItem AutoFocusOff;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
mScannerView = new ZXingScannerView(getActivity());
if(state != null) {
mFlash = state.getBoolean(FLASH_STATE, false);
mAutoFocus = state.getBoolean(AUTO_FOCUS_STATE, true);
mSelectedIndices = state.getIntegerArrayList(SELECTED_FORMATS);
mCameraId = state.getInt(CAMERA_ID, -1);
} else {
mFlash = false;
mAutoFocus = true;
mSelectedIndices = null;
mCameraId = -1;
}
return mScannerView;
}
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
FlashOn = menu.add(R.string.FlashLightOn).setIcon(R.drawable.ic_flash_on_24dp);
FlashOff = menu.add(R.string.FlashLightOff).setIcon(R.drawable.ic_flash_off_24dp).setVisible(false);
AutoFocusOn = menu.add(R.string.AutoFocusOn).setIcon(R.drawable.ic_auto_focus_on_24dp);
AutoFocusOff = menu.add(R.string.AutoFocusOff).setIcon(R.drawable.ic_auto_focus_off_24dp).setVisible(false);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_flash_on:
mFlash = !mFlash;
mScannerView.setFlash(mFlash);
FlashOn.setVisible(false);
FlashOff.setVisible(true);
return true;
case R.id.action_flash_off:
mFlash = !mFlash;
mScannerView.setFlash(mFlash);
FlashOn.setVisible(true);
FlashOff.setVisible(false);
return true;
case R.id.action_focus_on:
mAutoFocus = !mAutoFocus;
mScannerView.setAutoFocus(mAutoFocus);
AutoFocusOn.setVisible(false);
AutoFocusOff.setVisible(true);
return true;
case R.id.action_focus_off:
mAutoFocus = !mAutoFocus;
mScannerView.setAutoFocus(mAutoFocus);
AutoFocusOn.setVisible(true);
AutoFocusOff.setVisible(false);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onResume() {
super.onResume();
mScannerView.setResultHandler(this);
mScannerView.startCamera(mCameraId);
mScannerView.setFlash(mFlash);
mScannerView.setAutoFocus(mAutoFocus);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(FLASH_STATE, mFlash);
outState.putBoolean(AUTO_FOCUS_STATE, mAutoFocus);
outState.putIntegerArrayList(SELECTED_FORMATS, mSelectedIndices);
outState.putInt(CAMERA_ID, mCameraId);
}
@Override
public void handleResult(Result rawResult) {
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getActivity().getApplicationContext(), notification);
r.play();
} catch (Exception e) {}
// DO SOMETHING
}
@Override
public void onPause() {
super.onPause();
mScannerView.stopCamera();
}
}
公共类ScannerFragment扩展片段实现ZXingScannerView.ResultHandler{
私有静态最终字符串FLASH\u STATE=“FLASH\u STATE”;
私有静态最终字符串AUTO\u FOCUS\u STATE=“AUTO\u FOCUS\u STATE”;
私有静态最终字符串所选格式=“所选格式”;
专用静态最终字符串CAMERA\u ID=“CAMERA\u ID”;
私人ZXingScannerView mScannerView;
私有布尔mFlash;
私有布尔mAutoFocus;
私有数组列表mSelectedIndices;
private int mCameraId=-1;
MenuItem闪光;
MenuItem闪络;
MenuItem自动聚焦;
MenuItem自动聚焦关闭;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、捆绑状态){
mScannerView=newzxingscannerview(getActivity());
如果(状态!=null){
mFlash=state.getBoolean(FLASH_state,false);
mAutoFocus=state.getBoolean(自动聚焦状态,true);
mSelectedIndices=state.getIntegerArrayList(选定的_格式);
mCameraId=state.getInt(摄像机ID,-1);
}否则{
mFlash=false;
mAutoFocus=真;
mSelectedIndices=null;
mCameraId=-1;
}
返回mScannerView;
}
@凌驾
创建时的公共void(捆绑状态){
super.onCreate(state);
设置选项菜单(真);
}
创建选项菜单(菜单菜单,菜单充气机){
FlashOn=menu.add(R.string.FlashLightOn).setIcon(R.drawable.ic_flash_on_24dp);
FlashOff=menu.add(R.string.FlashLightOff).setIcon(R.drawable.ic_flash_off_24dp).setVisible(false);
AutoFocusOn=menu.add(R.string.AutoFocusOn).setIcon(R.drawable.ic_auto_focus_on_24dp);
AutoFocusOff=menu.add(R.string.AutoFocusOff).setIcon(R.drawable.ic_auto_focus_off_24dp).setVisible(false);
super.onCreateOptions菜单(菜单,充气机);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
开关(item.getItemId()){
案例R.id.行动\u闪光\u开启:
mFlash=!mFlash;
mScannerView.setFlash(mFlash);
FlashOn.setVisible(假);
闪光。设置可见(真);
返回true;
案例R.id.行动\闪烁\关闭:
mFlash=!mFlash;
mScannerView.setFlash(mFlash);
FlashOn.setVisible(true);
闪光。设置可见(假);
返回true;
案例R.id.行动重点关注:
mAutoFocus=!mAutoFocus;
mScannerView.setAutoFocus(mAutoFocus);
自动聚焦。设置可见(假);
AutoFocusOff.setVisible(真);
返回true;
案例R.id.action\u focus\u off:
mAutoFocus=!mAutoFocus;
mScannerView.setAutoFocus(mAutoFocus);
自动聚焦。设置可见(真);
自动聚焦关闭。设置可见(假);
返回true;
违约:
返回super.onOptionsItemSelected(项目);
}
}
@凌驾
恢复时公开作废(){
super.onResume();
mScannerView.setResultHandler(此);
mScannerView.startCamera(mCameraId);
mScannerView.setFlash(mFlash);
mScannerView.setAutoFocus(mAutoFocus);
}
@凌驾
SaveInstanceState上的公共无效(束超出状态){
super.onSaveInstanceState(超出状态);
outState.putBoolean(闪烁状态,mFlash);
putBoolean(自动聚焦状态,mAutoFocus);
outState.putIntegerArrayList(选定的_格式,MSelectedDices);
outState.putInt(摄像头ID,mCameraId);
}
@凌驾
公共无效HandlerResult(结果rawResult){
试一试{
Uri通知=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_通知);
Ringtone r=RingtoneManager.getRingtone(getActivity().getApplicationContext(),通知);
r、 play();
}捕获(例外e){}
//做点什么
}
@凌驾
公共无效暂停(){
super.onPause();
mScannerView.stopCamera();
}
}
条形码扫描仪.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
<fragment android:name="me.dm7.barcodescanner.zxing.sample.ScannerFragment"
android:id="@+id/scanner_fragment"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dip" />
</LinearLayout>
条形码扫描仪菜单
<?xml version="1.0" encoding="utf-8"?> <menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_flash_on"
android:icon="@drawable/ic_flash_on_24dp"
android:title="@string/FlashLightOn"
app:showAsAction="always" />
<item
android:id="@+id/action_flash_off"
android:icon="@drawable/ic_flash_off_24dp"
android:title="@string/FlashLightOff"
app:showAsAction="never" />
<item
android:id="@+id/action_focus_on"
android:icon="@drawable/ic_auto_focus_on_24dp"
android:title="@string/AutoFocusOn"
app:showAsAction="always" />
<item
android:id="@+id/action_focus_off"
android:icon="@drawable/ic_auto_focus_off_24dp"
android:title="@string/AutoFocusOff"
app:showAsAction="never" />
</menu>
Addbarcode\u scanner.xml
来自菜单
res文件夹,而不是布局。我发现了错误!app:showAsAction=“never”/>至app:showAsAction=“always”/>…好的,谢谢您的帮助:)但问题II和问题III有什么问题。有什么想法吗?更正:问题III仅与flash项有关。自动对焦项不会使应用程序崩溃您所说的小黑色条纹是什么意思?它是阴影吗?Post1的图像现在是新的。在这里,您可以看到摄影机活动与另一个“正常”活动之间的差异