0

I've an app that scans qrcodes and nfc tags. when I scan a qrcode I create an intent, put some strings in as extras(contents of qrcode), set the setAction to com.carefreegroup.QRCODE_ACTION, which is a custom action and then call startActivity(intent).

In the receiving activity the intent.getAction() is returning null. I've set an intent filter for the receiving activity in the manifest with an action the same as the calling activity.

Why is the 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] This is the whole activity that uses the ZXing library to scan the qrcode. It then sets the captured data in the intent as extras, then explicitly calls the next activity with 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();
            }
        }
    }

}

.

This is a snippet from the receiving activity.

    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 回答