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