android intent.getAction()返回null

时间:2012-09-12 14:27:11

标签: android android-intent

我有一个扫描qrcodes和nfc标签的应用。当我扫描qrcode时,我创建了一个intent,将一些字符串作为额外内容(qrcode的内容),将setAction设置为com.carefreegroup.QRCODE_ACTION,这是一个自定义操作,然后调用startActivity(intent)

在接收活动中,intent.getAction()返回null。我已经为清单中的接收活动设置了一个intent过滤器,其操作与调用活动相同。

为什么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的整个活动。然后,它将intent中捕获的数据设置为extras,然后使用startActivity()显式调用下一个activity。

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);

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

只需使用

Intent intent = new Intent(this, ClazzName.class);
intent.setAction("action_name");