Android 自动从NFC标签读取数据

Android 自动从NFC标签读取数据,android,nfc,Android,Nfc,嗨,我正在尝试从NFC标签读取数据。读取数据没有问题。但是我必须扫描我的标签两次才能显示数据。第一次扫描标签时,它会启动应用程序,但不会读取数据。所以要读取数据,我必须再次扫描我的标签。那么,我应该做些什么,以便在扫描我的标签时,它应该启动应用程序并从标签读取数据。该应用程序将从标签中读取数据,并更改我的android手机的配置文件。这是我的密码。。 谢谢你 public class Read extends Activity { Tag detectedTag; TextVi

嗨,我正在尝试从NFC标签读取数据。读取数据没有问题。但是我必须扫描我的标签两次才能显示数据。第一次扫描标签时,它会启动应用程序,但不会读取数据。所以要读取数据,我必须再次扫描我的标签。那么,我应该做些什么,以便在扫描我的标签时,它应该启动应用程序并从标签读取数据。该应用程序将从标签中读取数据,并更改我的android手机的配置文件。这是我的密码。。 谢谢你

public class Read extends Activity {

    Tag detectedTag;
    TextView txtType,txtSize,txtWrite,txtRead;
    Button btn_back;
    NfcAdapter nfcAdapter;
    IntentFilter[] readTagFilters;
    PendingIntent pendingIntent;
    byte[] new_payload;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        setContentView(R.layout.read);
        getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);

         nfcAdapter = NfcAdapter.getDefaultAdapter();
         detectedTag =getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
        txtType  = (TextView) findViewById(R.id.txtType);
        txtSize  = (TextView) findViewById(R.id.txtsize);
        txtRead  = (TextView) findViewById(R.id.txt_read);

        pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, 
                new Intent(this,getClass()).
                addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
        IntentFilter filter2     = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
        readTagFilters = new IntentFilter[]{tagDetected,filter2};


        btn_back = (Button) findViewById(R.id.btn_back);

        btn_back.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(getApplicationContext(),NFCTagWriterActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);

            }
        });
    }

    @Override
    protected void onNewIntent(Intent intent) {
        // TODO Auto-generated method stub

        setIntent(intent); 
        if(getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)){
            detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

            readFromTag(getIntent());
        }

        else{
            AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
            builder.setMessage("Tag Not Detected! Please Bring Tag In Proximity").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // TODO Auto-generated method stub

                }
            }).show();

            AlertDialog alert = builder.create();
            Toast.makeText(getApplicationContext(), "No Tag Detected", Toast.LENGTH_LONG).show();
        }

    }


    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        nfcAdapter.enableForegroundDispatch(this, pendingIntent, readTagFilters, null);
    }


    public void readFromTag(Intent intent){

        Ndef ndef = Ndef.get(detectedTag);


        try{
            ndef.connect();

            txtType.setText(ndef.getType().toString());
            txtSize.setText(String.valueOf(ndef.getMaxSize()));

            Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

            if (messages != null) {
                NdefMessage[] ndefMessages = new NdefMessage[messages.length];
                for (int i = 0; i < messages.length; i++) {
                    ndefMessages[i] = (NdefMessage) messages[i];
                }
            NdefRecord record = ndefMessages[0].getRecords()[0];

            byte[] payload = record.getPayload();
            int length = payload.length;

            new_payload = new byte[length-3];
            System.arraycopy(payload, 3, new_payload, 0,length-3);

            String text = new String(new_payload);

            txtRead.setText(text);
            Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();

            if(text.equalsIgnoreCase("silent")){
                Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
                AudioManager audiomanage = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
                audiomanage.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
            }
            if(text.equalsIgnoreCase("vibrate")){
                AudioManager audiomanage = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
                audiomanage.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); 
            }
            if(text.equalsIgnoreCase("normal")){
                AudioManager audiomanage = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  
                audiomanage.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 
            }

            ndef.close();

        }
        }
        catch (Exception e) {
            Toast.makeText(getApplicationContext(),e.toString(), Toast.LENGTH_LONG).show();
        }
    }   
} 
公共类读取扩展活动{
标签检测标签;
TextView txtType、txtSize、txtWrite、txtRead;
按钮btn_后退;
NfcAdapter NfcAdapter;
IntentFilter[]readTagFilters;
下垂的下垂的;
字节[]新的_有效载荷;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE\u自定义\u标题);
setContentView(R.layout.read);
getWindow().setFeatureInt(Window.FEATURE\u CUSTOM\u TITLE,R.layout.CUSTOM\u TITLE);
nfcAdapter=nfcAdapter.getDefaultAdapter();
detectedTag=getIntent().getParcelableExtra(NfcAdapter.EXTRA_标记);
txtType=(TextView)findViewById(R.id.txtType);
txtSize=(TextView)findViewById(R.id.txtSize);
txtRead=(TextView)findViewById(R.id.txt\u read);
PendingEvent=PendingEvent.getActivity(getApplicationContext(),0,
新的意图(这个,getClass()。
addFlags(意图、标志、活动、单个、顶部),0);
IntentFilter tagDetected=新的IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter filter2=新的IntentFilter(NfcAdapter.ACTION\u NDEF\u DISCOVERED);
readTagFilters=new IntentFilter[]{tagDetected,filter2};
btn_back=(按钮)findviewbyd(R.id.btn_back);
btn_back.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Intent i=新Intent(getApplicationContext(),NFCTagWriterActivity.class);
i、 添加标志(意图、标志、活动、清除、顶部);
星触觉(i);
}
});
}
@凌驾
受保护的void onNewIntent(意图){
//TODO自动生成的方法存根
设定意图(intent);
if(getIntent().getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)){
detectedTag=intent.getParcelableExtra(NfcAdapter.EXTRA_标记);
readFromTag(getIntent());
}
否则{
AlertDialog.Builder=新建AlertDialog.Builder(getApplicationContext());
builder.setMessage(“未检测到标记!请将标记放在附近”).setCancelable(false)。setPositiveButton(“确定”,新建DialogInterface.OnClickListener()){
@凌驾
public void onClick(DialogInterface dialog,int which){
//TODO自动生成的方法存根
}
}).show();
AlertDialog alert=builder.create();
Toast.makeText(getApplicationContext(),“未检测到标记”,Toast.LENGTH_LONG.show();
}
}
@凌驾
受保护的void onResume(){
//TODO自动生成的方法存根
super.onResume();
nfcAdapter.enableForegroundDispatch(this、pendingent、readTagFilters、null);
}
public void readFromTag(意图){
Ndef Ndef=Ndef.get(detectedTag);
试一试{
connect();
setText(ndef.getType().toString());
setText(String.valueOf(ndef.getMaxSize());
Parcelable[]messages=intent.getParcelableArrayExtra(NfcAdapter.EXTRA\u NDEF\u messages);
如果(消息!=null){
NdefMessage[]ndefMessages=新的NdefMessage[messages.length];
for(int i=0;i
问题是,onCreate方法中没有调用onNewIntent。想到的快速解决方案有:

在onCreate方法中,可以chceck意图类型。如果它是一个被发现的标记,那么处理它的方法与在onNewIntent中相同

另一个解决方案是将处理代码放在onResume中(如果你的应用程序只需要标记reding),并在其中检查意图

也许有更清洁的解决方案,我稍后会考虑一下,但现在,这是个问题