2016-10-31 2 views
-1

적합한 인 텐트 필터 요구 사항을 반영하기 위해 내 매니페스트 코드와 내 액티비티 코드를 다시 편집했습니다. 그러나 나는 여전히 같은 결과를 얻고 있습니다. 내 외부 기록을 읽을 수 없으며 그 이유를 모르겠습니다. NFC 도구 앱으로 태그를 스캔 할 때 예상대로 모든 것을 볼 수 있습니다. 내 배열을 "읽으려고"할 때 내 코드가 NullPointer를 생성하며 왜 그럴 수 있습니까?NFC 태그에서 배열/페이로드 읽기?

-------------- --------------------

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.bmt_01"> 

    <uses-permission android:name="android.permission.NFC"/> 
    <uses-permission android:name="android.permission.SEND_SMS"/> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-sdk android:minSdkVersion="15"/> ///must be changed in build.gradle. 


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 

      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
        <data 
        android:scheme="vnd.android.nfc" 
        android:host="ext" 
        android:pathPrefix="/com.example.bmt_01:externaltype" 
        /> 
      </intent-filter> 



     </activity> 
    </application> 

</manifest> 

을 MANIFEST를 BEGIN --- ----------- 끝 매니페스트 --------------------

------------- -BEGIN 주요 활동 -------------

package com.example.bmt_01; 

import android.app.Activity; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.Uri; 
import android.nfc.NdefMessage; 
import android.nfc.NdefRecord; 
import android.nfc.NfcAdapter; 
import android.nfc.Tag; 
import android.nfc.tech.Ndef; 
import android.nfc.tech.NdefFormatable; 
import android.os.Parcelable; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.io.ByteArrayOutputStream; 
import java.io.UnsupportedEncodingException; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.Locale; 


public class MainActivity extends AppCompatActivity { 
    String currentPayload = ""; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    } 

    @Override 
    protected void onNewIntent(Intent intent) 
    { 
      Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 

     //added the below lines, can delete if they don't work. 
      NdefRecord payload = ((NdefMessage)rawMsgs[0]).getRecords()[0]; 
      String currentPayload = new String(payload.getPayload()); 


       if (currentPayload.equals("1")) 
       { 
        Toast.makeText(this, "NFC Scan1: " + currentPayload, Toast.LENGTH_SHORT).show(); 


        String url = "http://www.google.com"; 
        Intent l = new Intent(Intent.ACTION_VIEW); 
        l.setData(Uri.parse(url)); 
        startActivity(l); 
       } 
       ///else 
       ///{ 
        if (currentPayload.equals("2")) 
        { 
         Toast.makeText(this, "NFC Scan2: " + currentPayload, Toast.LENGTH_SHORT).show(); 


         String url = "http://www.yahoo.com"; 
         Intent l = new Intent(Intent.ACTION_VIEW); 
         l.setData(Uri.parse(url)); 
         startActivity(l); 
        } 
       ///} 
    } 

    protected void onResume() 
    { 
     super.onResume(); 
     Toast.makeText(this, "NFC Scan3: ", Toast.LENGTH_SHORT).show(); 
     enableForegroundDispatchSystem(); 
    } 

    @Override 
    protected void onPause() 
    { 
     super.onPause(); 
     disableForegroundDispatchSystem(); 
    } 

    private void enableForegroundDispatchSystem() { 
     Toast.makeText(this, "NFC Scan4: ", Toast.LENGTH_SHORT).show(); 
    } 

    private void disableForegroundDispatchSystem() { 
     Toast.makeText(this, "NFC Scan5: ", Toast.LENGTH_SHORT).show(); 

     onNewIntent(getIntent()); 


    } 
} 

-------------- END 주요 활동 --------- ------

업데이트 *

필자의 AAR 기능이 올바르게 추가되어야합니다. 위의 앱을 휴대 전화에 설치했지만 열지 않은 상태에서 내 AAR이 자동으로 열리고 테스트 태그를 스캔 할 때 애플리케이션이 실행됩니다. 그래서 배열에서 AAR을 "볼"수 있지만 외부 레코드는 볼 수 없습니다.

여전히 내 태그에서 외부 레코드를 읽을 수 없습니다. 분명히 내가 뭔가 잘못하고있다. 그러나 나는 모른다.

+0

어떤 문제가 발생 했습니까? 'NDEF_DISCOVERED' 의도를 얻었습니까? 앱 매니페스트에서 NDEF_DISCOVERED 인 텐트를 받기 위해 제대로 등록 했습니까? –

+0

매니페스트가 올바르게 구성되어 있다고 생각합니다. 내 문제는 "payloadString"값을 캡처 할 수 없다는 것입니다. 배열을 잘못 읽고 있다고 생각합니다. "for"루프를 포기할 계획입니다. 본질적으로, 내가하려는 것은 외부 레코드를 읽고 해당 레코드의 가치에 해당하는 웹 사이트로 사용자를 보내는 것입니다. 즉 payloadString = 1 인 경우 www.yahoo.com으로 이동하십시오. payloadString = 2 인 경우 www.google.com으로 이동하십시오. – James

+0

그러면 이전에 가지고 있던 코드가'payloadString'을 전달 했어야합니다 (매우 우아하고 효율적인 방법은 아니지만). "NFC Scan7 : ..."토스트 (업데이트 된 코드에서)를 얻었습니까? 'rawMsgs! = null'입니까? 'rawMsgs [0]! = null'입니까? –

답변

0

메시지를 혼합하여 for 루프에 녹음하십시오. 그러나 하나의 NDEF 메시지 만 있지만이 메시지는 여러 레코드를 보유 할 수 있습니다. rawMsgs[0] 만 사용해야합니다. 그런 다음 for 루프는 해당 메시지의 모든 레코드를 반복 할 수 있습니다.

+0

"for"루프를 버리면 위치 0의 외부 레코드를 어떻게 간단히 읽을 수 있습니까? 필자는 "for"로직이 필요 없으며, 일단 레코드를 한 번 평가 한 다음 해당 레코드의 값에 해당하는 웹 사이트로 사용자를 보냅니다. 즉 payloadString = 1 인 경우 www.yahoo.com으로 이동하십시오. ; payloadString = 2 인 경우 www.google.com으로 이동하십시오. – James

0

나는 NDEF 레코드를 구문 분석 할 수있는 library을 만들었습니다.

올바른 형식입니다. 외부 형식을 사용하여 바이너리 paylod를 래핑합니다. 라이브러리는 원하는 경우 외부 형식 파서/레코드 형식을 연결하는 것을 지원합니다.

+0

위의 내 코멘트를 참조하십시오. 이런 종류의 활동을 지원하는 라이브러리의 구성 요소가 있습니까? – James

+0

라이브러리는 NDEF 유형을 읽는 것을 지원합니다. 페이로드를 읽었을 때 결정한 사항은 귀하에게 달려 있습니다. – ThomasRS