0

qrcodeとnfcタグをスキャンするアプリがあります。qrcodeをスキャンするときは、インテントを作成し、いくつかの文字列をエクストラ(qrcodeのコンテンツ)として入力し、カスタムアクションであるにを設定してsetActionからcom.carefreegroup.QRCODE_ACTIONを呼び出しますstartActivity(intent)

受信アクティビティでintent.getAction()は、はnullを返しています。マニフェストの受信アクティビティに、呼び出しアクティビティと同じアクションを持つインテントフィルターを設定しました。

getActionがnullなのはなぜですか?

public static final String CUSTOM_QRCODE_ACTION = "com.carefreegroup.QRCODE_ACTION";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.qrloggedinmain);
        nfcscannerapplication = (NfcScannerApplication) getApplication();

        ////////////////////////get company options///////////////////////////////
        SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
        tagTouchInterval = appSharedPrefs.getString("10", null);
        Long tagtouchinteval = new Long(tagTouchInterval);
        companyOptionTime = 1000* 60 * tagtouchinteval ;

        Button ScanQrCode = (Button)findViewById(R.id.buttonqrscanner);

        ScanQrCode.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.e(TAG, "onclicked scan");

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

                startActivityForResult(intent, 0);

            }
        });


    }// end of onCreate


    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        Log.e(TAG, "in onActivityResult");
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                Log.e(TAG, "result ok");
                ///////////////////////////////
                tagScanTime  = new DateTime();
                thirtySecsAgo = tagScanTime.minus(30000);
                DateTimeFormatter df = DateTimeFormat.forPattern("dd/MMM/yy h:mmaa");
                String formattedScanTime = df.print(tagScanTime);
                Log.e(TAG, "formatted tag scan time = " + formattedScanTime);
                String formattedthirtysecsAgoTime = df.print(thirtySecsAgo);
                Log.e(TAG, "formatted thity secs ago time = " + formattedthirtysecsAgoTime);


                String contents = intent.getStringExtra("SCAN_RESULT");
                Toast.makeText(this, "scanner has found " + contents,
                        Toast.LENGTH_LONG).show();


                String[] splitPayload = contents.split("@");


                type = splitPayload[0];
                compId = splitPayload[1];
                personId = splitPayload[2];
                personName = splitPayload[3];

                Intent QRDataIntent = new Intent(this,
                        NfcscannerActivity.class);

                intent.putExtra("type", type);
                intent.putExtra("compId", compId);
                intent.putExtra("personId", personId);
                intent.putExtra("personName", personName);
                intent.setAction(CUSTOM_QRCODE_ACTION);
                intent.setType("text/plain");
                startActivity(QRDataIntent);

String intentAction = intent.getAction();

 if ( intentAction.equalsIgnoreCase(QRCODE_ACTION)) {

            Log.e(TAG, "QR Code scanned");
            String _type = intent.getStringExtra("type");
            String _compId = intent.getStringExtra("compId");
            String _personId = intent.getStringExtra("personId");
            String _personName = intent.getStringExtra("personName");

            Log.e(TAG, "payload = " + _type + " " + _compId + " " + _personId + " " + _personName);

 <activity android:name=".NfcscannerActivity"  >
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />

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

                <data android:mimeType="text/plain" />
            </intent-filter>

            <intent-filter>
                <action android:name="com.carefreegroup.QRCODE_ACTION" />

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

                <data android:mimeType="text/plain" />


            </intent-filter>
        </activity>

[UPDATE1] これは、ZXingライブラリを使用してqrcodeをスキャンするアクティビティ全体です。次に、キャプチャされたデータをエクストラとしてインテントに設定し、startActivity()を使用して次のアクティビティを明示的に呼び出します。

package com.carefreegroup;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class QrLoggedIn extends Activity{

    private static final String TAG = QrLoggedIn.class.getSimpleName();
    private NfcScannerApplication nfcscannerapplication;
    private String tagTouchInterval;
    private long companyOptionTime;
    private DateTime tagScanTime;
    private DateTime thirtySecsAgo;
    private Boolean carerLoggedIn;
    private String type;
    private String personId;
    private String personName;
    private String compId;
    private Cursor cursor;
    static final String CARER_TYPE = "2";  
    static final String CLIENT_TYPE = "1";
    private final String IN = "in";
    private final String OUT = "out";
    private ContentValues values;
    public static final String CUSTOM_QRCODE_ACTION = "com.carefreegroup.QRCODE_ACTION";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.qrloggedinmain);
        nfcscannerapplication = (NfcScannerApplication) getApplication();

        ////////////////////////get company options///////////////////////////////
        SharedPreferences appSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
        tagTouchInterval = appSharedPrefs.getString("10", null);
        Long tagtouchinteval = new Long(tagTouchInterval);
        companyOptionTime = 1000* 60 * tagtouchinteval ;

        Button ScanQrCode = (Button)findViewById(R.id.buttonqrscanner);

        ScanQrCode.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.e(TAG, "onclicked scan");

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

                startActivityForResult(intent, 0);

            }
        });


    }// end of onCreate


    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        Log.e(TAG, "in onActivityResult");
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                Log.e(TAG, "result ok");
                ///////////////////////////////
                tagScanTime  = new DateTime();
                thirtySecsAgo = tagScanTime.minus(30000);
                DateTimeFormatter df = DateTimeFormat.forPattern("dd/MMM/yy h:mmaa");
                String formattedScanTime = df.print(tagScanTime);
                Log.e(TAG, "formatted tag scan time = " + formattedScanTime);
                String formattedthirtysecsAgoTime = df.print(thirtySecsAgo);
                Log.e(TAG, "formatted thity secs ago time = " + formattedthirtysecsAgoTime);


                String contents = intent.getStringExtra("SCAN_RESULT");
                Toast.makeText(this, "scanner has found " + contents,
                        Toast.LENGTH_LONG).show();


                String[] splitPayload = contents.split("@");


                type = splitPayload[0];
                compId = splitPayload[1];
                personId = splitPayload[2];
                personName = splitPayload[3];

                Intent QRDataIntent = new Intent(this,
                        NfcscannerActivity.class);

                intent.putExtra("type", type);
                intent.putExtra("compId", compId);
                intent.putExtra("personId", personId);
                intent.putExtra("personName", personName);
                intent.setAction(CUSTOM_QRCODE_ACTION);
                intent.setType("text/plain");
                startActivity(QRDataIntent);



            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
                Log.e(TAG, "There's a problem with the scan. Scan result failed");
                Toast.makeText(this, "There's a problem with the scan. Scan result failed",
                        Toast.LENGTH_LONG).show();
            }
        }
    }

}

これは、受信アクティビティからのスニペットです。

    String intentAction = intent.getAction();

    Log.e(TAG, "action of intent = " + intentAction);

    if( intentAction.equalsIgnoreCase(NFC_ACTION)){

    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    tagId = bytesToHexString(tag.getId());

    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {

        Log.e(TAG, "NFC Tag scanned");
        // //////////////////////////////////////////////////////////////////////
        // get the messages from the intent
        Parcelable[] rawMsgs = intent
                .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMsgs != null) {
            msgs = new NdefMessage[rawMsgs.length];
            for (int i = 0; i < rawMsgs.length; i++) {
                msgs[i] = (NdefMessage) rawMsgs[i];
            }
        }
    } else {
        Log.e(TAG, "ndef not discovered!!!!!!");
    }

    // ////////////////////////////////////////////////////////////////////////////////////
    // process the msgs array
    for (int i = 0; i < msgs.length; i++) {

        NdefRecord[] records = msgs[i].getRecords();
        Log.e(TAG, "ndefrecord has a length of " + records.length);

        tr = parse(records[i]);
        payload = tr.getText();

        Log.e(TAG, "TextRecord.text = " + tr.getText());


    }

    // /////////////////////////////////////////////////// split the payload
    // using delimiter. assign value at position[0] to tagType
    String[] splitPayload = payload.split("¦");



    tagType = splitPayload[0];
    tagCompany = splitPayload[1];
    tagPerson = splitPayload[2];
    tagUserName = splitPayload[3];

    }else if ( intentAction.equalsIgnoreCase(QRCODE_ACTION)) {

        Log.e(TAG, "QR Code scanned");
        String _type = intent.getStringExtra("type");
        String _compId = intent.getStringExtra("compId");
        String _personId = intent.getStringExtra("personId");
        String _personName = intent.getStringExtra("personName");

        Log.e(TAG, "payload = " + _type + " " + _compId + " " + _personId + " " + _personName);
4

2 に答える 2

6

それを見つけた!

このコードでは:

Intent QRDataIntent = new Intent(this, NfcscannerActivity.class);

intent.putExtra("type", type);
intent.putExtra("compId", compId);
intent.putExtra("personId", personId);
intent.putExtra("personName", personName);
intent.setAction(CUSTOM_QRCODE_ACTION);
intent.setType("text/plain");
startActivity(QRDataIntent);

エクストラを入れて変数にアクションを設定しますが、変数を使用しintentて呼び出します!アクションセットもエクストラもありません!startActivity()QRDataIntent

代わりにこれを試してください:

Intent QRDataIntent = new Intent(this, NfcscannerActivity.class);

QRDataIntent.putExtra("type", type);
QRDataIntent.putExtra("compId", compId);
QRDataIntent.putExtra("personId", personId);
QRDataIntent.putExtra("personName", personName);
QRDataIntent.setAction(CUSTOM_QRCODE_ACTION);
QRDataIntent.setType("text/plain");
startActivity(QRDataIntent);
于 2012-09-12T18:39:02.640 に答える
0

使用するだけ

Intent intent = new Intent(this, ClazzName.class);
intent.setAction("action_name");
于 2016-06-14T07:00:44.007 に答える