0

QRコードをスキャンしようとすると、アプリケーションが閉じます。以前はasynctaskを使用していませんでしたが、問題なく動作していました。asynctaskの動作に問題があると思いますが、どんな提案でも大歓迎です。以下は私のlogcatです

03-26 12:19:16.797: E/AndroidRuntime(1104): FATAL EXCEPTION: Thread-101
03-26 12:19:16.797: E/AndroidRuntime(1104): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.google.zxing.client.android.SCAN pkg=com.google.zxing.client.android (has extras) }
03-26 12:19:16.797: E/AndroidRuntime(1104):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622)
03-26 12:19:16.797: E/AndroidRuntime(1104):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
03-26 12:19:16.797: E/AndroidRuntime(1104):     at android.app.Activity.startActivityForResult(Activity.java:3370)
03-26 12:19:16.797: E/AndroidRuntime(1104):     at android.app.Activity.startActivityForResult(Activity.java:3331)
03-26 12:19:16.797: E/AndroidRuntime(1104):     at com.example.restaurantapp.MainActivity$InitTask$1.run(MainActivity.java:68)
03-26 12:19:16.797: E/AndroidRuntime(1104):     at java.lang.Thread.run(Thread.java:856)

これが私の主な活動です

public class MainActivity extends Activity {
    Button btnScan;
    TextView result1;
    ImageView imgScan;
    InitTask scan;
    //@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //btnScan=(Button)findViewById(R.id.button1);
        imgScan=(ImageView)findViewById(R.id.imageButton1);

        imgScan.setOnClickListener(new OnClickListener() {


                @Override
                public void onClick(View v) {
                    scan=new InitTask();
                    scan.execute();
                }

            });

    }
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                result1=(TextView)findViewById(R.id.textView1);
              String values = intent.getStringExtra("SCAN_RESULT");
              //String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
              result1.setText(values);
              Toast.makeText(MainActivity.this,
                        "Scan Result:" + values, Toast.LENGTH_LONG)
                        .show();
           } else if (resultCode == RESULT_CANCELED) {
                 Toast.makeText(MainActivity.this, "you cancelled scanning", Toast.LENGTH_LONG).show();
           }
        }
     }

    private class InitTask extends AsyncTask<Void,Void,Void>{

        protected Void doInBackground(Void...unused){

          new Thread(new Runnable() {
                 @Override
                 public void run() {

                     Intent intent = new Intent(
                             "com.google.zxing.client.android.SCAN");
                     intent.setPackage("com.google.zxing.client.android");
                     intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
                     startActivityForResult(intent, 0);
                 }
                }).start();
            return null;
        }
    }
}

助けてください、これを引き起こしているものは何ですか?ありがとうございました :)

4

4 に答える 4

1

バックグラウンドスレッドはまったく必要ありません。非同期タスクでもスレッドでもありません。スレッドは、データベースやhttpリクエストでクエリを実行する場合のように、UIスレッドをブロックする可能性のある長時間実行される操作を対象としています。

あなたの場合、結果を得るために新しいアクティビティを起動しているので、ログに「このアプリケーションはメインスレッドで多くの作業を行っている可能性があります」と表示されている場合でも、次に開始したアクティビティがメインで何かを実行している可能性が高くなります。メインアクティビティではなく、UIスレッド。非同期タスクを適用すると確信している場合でも、おそらく間違ったアクティビティで実行しています。これは、新しいインテントを起動した後、現在のアクティビティがonPause()に入り、メインUIスレッドがスキャンアクティビティ用になるためです。

于 2013-03-26T14:58:15.393 に答える
0
protected Void doInBackground(Void...unused){

          new Thread(new Runnable() {
                 @Override
                 public void run() {

                     Intent intent = new Intent(
                             "com.google.zxing.client.android.SCAN");
                     intent.setPackage("com.google.zxing.client.android");
                     intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
                     startActivityForResult(intent, 0);
                 }
                }).start();
             return null;

実行可能なスレッドを削除します doInBackground(それ自体がスレッドです)

 protected Void doInBackground(Void...unused){


                         Intent intent = new Intent(
                                 "com.google.zxing.client.android.SCAN");
                         intent.setPackage("com.google.zxing.client.android");
                         intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
                         startActivityForResult(intent, 0);

                 return null;

これは私が最初に見たものですそれを実装してみて、それが機能するかどうかを確認してください

于 2013-03-26T12:32:42.683 に答える
0

2つのことをする必要があります

  1. AndroidManifest.xmlファイルでアクティビティを定義します

    <activity
            android:name="com.google.zxing.client.android.CaptureActivity"
            android:configChanges="orientation|keyboardHidden"
            android:screenOrientation="landscape"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
            <intent-filter>
                <action android:name="com.google.zxing.client.android.SCAN" />
    
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
    </activity>
    
  2. アプリケーションにzxinglibを含めるか、デバイスにzxingバーコードアプリケーションをインストールする必要があります

libとして、プロジェクトをlibとして作成し、プロジェクトにlibを含める必要があります。

注:最も重要なのは、inBackground()メソッドにUIが実装されているプロセスを実行しないことです。これは、UIプロセスではなく、バックグラウンドプロセス専用になります。

于 2013-03-26T12:34:43.187 に答える
0

MainFestで

 <activity
        android:name="com.google.zxing.client.android.CaptureActivity"
        >
        <intent-filter>
            <action android:name="com.google.zxing.client.android.SCAN" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

これを試して

于 2013-03-26T12:36:11.293 に答える