2012-09-12 148 views
0

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

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

为什么getAction为空?

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] 这是一个使用的斑马线库扫描QRCode的整个活动。然后它将捕获的数据设置为extras,然后使用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); 
+0

什么方法是这样的代码:'字符串intentAction = intent.getAction();如果(intentAction.equalsIgnoreCase(QRCODE_ACTION)){'?变量'intent'如何设置? –

+0

@DavidWasser你好我已更新我的帖子,包括两段代码,显示意图如何设置和接收。谢谢。 – turtleboy

+0

@DavidWasser哦对了对不起,intent.getAction()在接收活动的onCreate方法中。 – turtleboy

回答

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

哦,我的天啊!我花了整整一天的时间在这工作上!嘿谢谢纠正一个愚蠢的错误,我真的很感激它。 – turtleboy

+1

@IgorGanapolsky在第一个代码块中,附加内容不会添加到传递给'startActivity()'的'Intent'! –

+1

它太神奇了,我们可以犯这样的错误!!!!!谢谢 – LoveMeow

0

只需使用

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