2012-09-12 149 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");