0

チュートリアルのソースをまったく変更せずに使用していますが、NFC タグを読み取れません。

タグをスキャンしても何も起こりません。

次のように記述された NFC タグを読み取ることはサポートされています: WIFINETWORKNAME,password

^ - チュートリアルには「ネットワーク名とパスワードを (コンマで区切って) タグに書き込む」と書かれており、3 つの方法で試しましたが、何も機能しません。

また、新しいワイヤレス プロファイルを作成することもありません。

http://schoolofcode.wordpress.com/2013/03/20/connect-to-wifi-using-android-nfc-phone-and-nfc-tag/

それは何をしますか:

NFC タグをスキャンすると起動します (タグに AAR を書き込む場合)

しないこと:

  • 新しいワイヤレス プロファイルを作成する

  • NFC タグを読み取り、適切に接続する

私がやろうとしたこと:

NFC タグを次のように書き込み、読み取ります。

WIFINETWORKNAME、パスワード

WIFINETWORKNAME、パスワード

WIFINETWORKNAME、パスワード

ジャワ:

import java.util.List;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.nfc.NdefMessage;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Connect2 extends Activity {
private EditText wifiname;
private String password;
private  NfcAdapter mAdapter;
private  PendingIntent mPendingIntent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.connect2);

        mAdapter = NfcAdapter.getDefaultAdapter(this);
        // Create a generic PendingIntent that will be deliver to this activity.
        // The NFC stack
        // will fill in the intent with the details of the discovered tag before
        // delivering to
        // this activity.
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
                getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

        // Setup an intent filter for all MIME based dispatches
        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

        WifiManager wifiMgr = (WifiManager)getSystemService(Context.WIFI_SERVICE);
        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
        String connectionName = wifiInfo.getSSID();

        TextView tv=(TextView)findViewById(R.id.wifiname);
        if(connectionName==null){
            tv.setText("You are not connected  ");
        }else{

            tv.setText("You are linked to: "+connectionName+"   ");
        }

        Button close=(Button)findViewById(R.id.close);
        close.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();
                System.exit(0);
            }
        });

    }
    @Override
    public void onResume(){
        super.onResume();

        if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())||NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())){
            processReadIntent(getIntent());
        }
    }
    @Override
    public void onNewIntent(Intent intent){
        setIntent(intent);
    }
    public void processReadIntent(Intent intent){
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);

        // only one message sent during the beam
        NdefMessage msg = (NdefMessage) rawMsgs[0];

        // record 0 contains the MIME type, record 1 is the AAR, if present
        Log.d("msg", msg.getRecords()[0].getPayload().toString());

        byte[]payload=msg.getRecords()[0].getPayload();
        String msgtext=null;
        try{

        //Get the Text Encoding
        String textEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" : "UTF-16";

        //Get the Language Code
        int languageCodeLength = payload[0] & 0077;
        String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");

        //Get the Text
        msgtext = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
        }catch(Exception e){

        }

        // splitting the message by comma. The first part is the name and 2nd part is the password.
        String[]tagdata=msgtext.split(",");

        String networkSSID = tagdata[0].toString();
        String networkPass = tagdata[1].toString();

        WifiConfiguration conf = new WifiConfiguration();
        conf.SSID = "\"" + networkSSID + "\"";   // Please note the quotes. String should contain ssid in quotes

        conf.preSharedKey = "\""+ networkPass +"\"";
        WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
        wifiManager.addNetwork(conf);

        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for( WifiConfiguration i : list ) {
            if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
                 wifiManager.disconnect();
                 wifiManager.enableNetwork(i.networkId, true);
                 wifiManager.reconnect();               
                 break;
            }           
         }

        TextView wifiname=(TextView)findViewById(R.id.wifiname);
        wifiname.setTextColor( getResources().getColor(R.color.solid_red) );
        wifiname.setText("Successfully linked "+networkSSID +"   ");

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}   

実行しようとすると、LogCat に次のように表示されます。

04-05 13:08:37.107: D/NfcDispatcher(905): dispatch tag: TAG: Tech [android.nfc.tech.MifareUltralight, android.nfc.tech.NfcA, android.nfc.tech.Ndef] message: NdefMessage [NdefRecord tnf=1 type=54 payload=02656E414E4452452D50435F4E4554574F524B2C2070617373776F7264]
04-05 13:08:37.107: D/NfcHandover(905): tryHandover(): NdefMessage [NdefRecord tnf=1 type=54 payload=02656E414E4452452D50435F4E4554574F524B2C2070617373776F7264]
04-05 13:08:37.117: I/ActivityManager(478): START u0 {flg=0x10008000 cmp=com.android.nfc/.NfcRootActivity (has extras)} from pid 905
04-05 13:08:37.137: I/NfcDispatcher(905): matched multiple TECH
04-05 13:08:37.147: I/ActivityManager(478): START u0 {cmp=com.android.nfc/.TechListChooserActivity (has extras)} from pid 905
04-05 13:08:37.317: D/dalvikvm(905): GC_CONCURRENT freed 7783K, 22% free 15072K/19148K, paused 9ms+9ms, total 52ms
04-05 13:08:37.327: I/ActivityManager(478): Displayed com.android.nfc/.TechListChooserActivity: +185ms (total +196ms)
04-05 13:08:38.247: D/NativeNfcTag(905): Tag lost, restarting polling loop
4

1 に答える 1

0

このようにアプリケーションを作成すると、チュートリアルが単純すぎると思います。

  1. ユーザー/名前とパスワードを保存するためにテキストレコードを使用しているようです。死刑に値する犯罪ではありませんが、Well-known URI Record や Handover Records などのより良い代替手段があり、作者はそれをマイム レコードと考えているようです。

  2. セキュリティの種類については何も述べていないため、ネットワークを追加しても機能しません。コードが機能したことはないと思います。

  3. コードは wifi 関連のブロードキャスト イベントを完全に無視します。

于 2013-04-05T22:28:18.640 に答える