【问题标题】:Android zxing throws NullPointerExceptionAndroid zxing 抛出 NullPointerException
【发布时间】:2014-04-10 02:47:39
【问题描述】:

我打算使用 ZXING 库在我的 Android 应用程序中提供二维码功能。我能够让它工作,但它会引发异常。我正在使用库 github 链接提供的示例代码。谁能告诉我是什么导致了异常?

链接到IntentIntegratorIntentResult 类。

MainActivity 的示例代码(使用 eclipse 生成初始代码):

package com.example.testapp;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.google.zxing.integration.android.IntentIntegrator;

public class MainActivity extends Activity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button) findViewById(R.id.button1);

        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                try {
                    IntentIntegrator integrator = new IntentIntegrator(
                            MainActivity.this);
                    AlertDialog d = integrator.shareText("sample text here");
                    d.show();
                } catch (Exception e) {
                    Log.e(TAG, Log.getStackTraceString(e));
                }

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

来自 LogCat 的异常:

04-09 13:08:13.923: E/MainActivity(27574): java.lang.NullPointerException
04-09 13:08:13.923: E/MainActivity(27574):  at com.example.testapp.MainActivity$1.onClick(MainActivity.java:38)
04-09 13:08:13.923: E/MainActivity(27574):  at android.view.View.performClick(View.java:4633)
04-09 13:08:13.923: E/MainActivity(27574):  at android.view.View$PerformClick.run(View.java:19330)
04-09 13:08:13.923: E/MainActivity(27574):  at android.os.Handler.handleCallback(Handler.java:733)
04-09 13:08:13.923: E/MainActivity(27574):  at android.os.Handler.dispatchMessage(Handler.java:95)
04-09 13:08:13.923: E/MainActivity(27574):  at android.os.Looper.loop(Looper.java:157)
04-09 13:08:13.923: E/MainActivity(27574):  at android.app.ActivityThread.main(ActivityThread.java:5356)
04-09 13:08:13.923: E/MainActivity(27574):  at java.lang.reflect.Method.invokeNative(Native Method)
04-09 13:08:13.923: E/MainActivity(27574):  at java.lang.reflect.Method.invoke(Method.java:515)
04-09 13:08:13.923: E/MainActivity(27574):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
04-09 13:08:13.923: E/MainActivity(27574):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
04-09 13:08:13.923: E/MainActivity(27574):  at dalvik.system.NativeStart.main(Native Method)
04-09 13:08:13.933: D/AbsListView(27574): unregisterIRListener() is called 
04-09 13:08:14.518: D/AbsListView(27574): onVisibilityChanged() is called, visibility : 4
04-09 13:08:14.518: D/AbsListView(27574): unregisterIRListener() is called 

提前致谢。

解决方案:

感谢大家的帮助。

正如 Tanis.7x 在下面指出的,我的错误在于 d.show() 行。

我正在尝试按照我的理解写出问题的根源,如果错了,请纠正我。

方法shareText()当且仅当它找不到包“com.google.zxing.client.android”时返回一个对话框。

该对话框应用于提示用户从 Playstore 安装应用程序“条形码阅读器”。

由于我已经有了包(通过在我的项目中包含 jar 文件),该方法返回 null,我在调用该方法时犯了(愚蠢的)错误。

【问题讨论】:

  • 发布activity_main.xml布局。
  • 第 38 行是哪一行?
  • 确实,真正的第 38 行是什么是一个谜,因为您发布的代码和堆栈跟踪不匹配。
  • 第 38 行是 d.show();。无论如何,现在问题已经解决了。显然,在我阅读文档和示例代码数小时后让它工作后,我忽略了一个基本说明。该对话框为空,因为我已在我的应用程序中安装了库(shareText 方法返回一个对话框,要求用户安装条形码阅读器,以防它不可用,否则为空)。

标签: android zxing


【解决方案1】:

shareText() 方法不保证返回对话框。

根据文档,shareText() 将返回:

如果需要提示,则向用户显示提示他们下载应用程序的 AlertDialog,否则为 null

如果用户已经拥有该应用,则无需显示对话框,该方法将返回null。

另请注意,在此方法返回时对话框已经显示,因此您不需要自己显示。我建议您查看IntentIntegrator source 了解更多信息。

【讨论】:

  • 好的,谢谢。我现在终于可以睡觉了。我评论了 d.show() 行并且它有效。我试图给你投票,但我没有足够的声望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2013-03-11
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
相关资源
最近更新 更多