当前位置:编程学习 > wap >>

NFC Android 开发问题

我在网上看了很多Android系统NFC开发的实例,但是,在我实际使用中始终无法是用畅通,所以在此求助!!
我的实例是

AndroidManifest.xml:
 
 
 

[html] <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?> 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="org.reno" 
     android:versionCode="1" 
     android:versionName="1.0" > 
     <uses-permission android:name="android.permission.NFC" /> 
     <uses-sdk android:minSdkVersion="14" /> 
     <uses-feature android:name="android.hardware.nfc" android:required="true" /> 
     <application 
         android:icon="@drawable/ic_launcher" 
         android:label="@string/app_name" > 
         <activity 
             android:name="org.reno.Beam" 
             android:label="@string/app_name" 
             android:launchMode="singleTop" > 
             <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.TECH_DISCOVERED" /> 
             </intent-filter> 
             <meta-data 
                 android:name="android.nfc.action.TECH_DISCOVERED" 
                 android:resource="@xml/nfc_tech_filter" /> 
         </activity> 
     </application> 
 </manifest> 
 </span> 
 <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="org.reno"
     android:versionCode="1"
     android:versionName="1.0" >
     <uses-permission android:name="android.permission.NFC" />
     <uses-sdk android:minSdkVersion="14" />
     <uses-feature android:name="android.hardware.nfc" android:required="true" />
     <application
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name" >
         <activity
             android:name="org.reno.Beam"
             android:label="@string/app_name"
             android:launchMode="singleTop" >
             <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.TECH_DISCOVERED" />
             </intent-filter>
             <meta-data
                 android:name="android.nfc.action.TECH_DISCOVERED"
                 android:resource="@xml/nfc_tech_filter" />
         </activity>
     </application>
 </manifest>
 </span>
 
 
 
res/xml/nfc_tech_filter.xml:
 
 
 

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
 
    <tech-list>
 
       <tech>android.nfc.tech.MifareClassic</tech>
 
    </tech-list>
 
</resources>
 
 
res/layout/main.xml
 
 
 
[html] <?xml version="1.0" encoding="utf-8"?> 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 
  
     <ScrollView 
         android:id="@+id/scrollView" 
         android:layout_width="fill_parent" 
         android:layout_height="fill_parent" 
         android:background="@android:drawable/edit_text" > 
  
         <TextView 
             android:id="@+id/promt" 
             android:layout_width="fill_parent" 
             android:layout_height="wrap_content" 
             android:scrollbars="vertical" 
             android:singleLine="false" 
             android:text="@string/info" /> 
     </ScrollView> 
  
 </LinearLayout> 
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >
 
    <ScrollView
         android:id="@+id/scrollView"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:background="@android:drawable/edit_text" >
 
        <TextView
             android:id="@+id/promt"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:scrollbars="vertical"
             android:singleLine="false"
             android:text="@string/info" />
     </ScrollView>
 
</LinearLayout>

<resources> 
     <string name="app_name">NFC测试</string> 
     <string name="info">扫描中。。。</string> 
 </resources> 
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
     <string name="app_name">NFC测试</string>
     <string name="info">扫描中。。。</string>
 </resources>
 
 
 
src/org/reno/Beam.java
 
[java] package org.reno; 
  
 import android.app.Activity; 
 import android.content.Intent; 
 import android.nfc.NfcAdapter; 
 import android.nfc.Tag; 
 import android.nfc.tech.MifareClassic; 
 import android.os.Bundle; 
 import android.widget.TextView; 
  
 public class Beam extends Activity { 
     NfcAdapter nfcAdapter; 
     TextView promt; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.main); 
         promt = (TextView) findViewById(R.id.promt); 
         // 获取默认的NFC控制器  
         nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
         if (nfcAdapter == null) { 
             promt.setText("设备不支持NFC!"); 
             finish(); 
             return; 
         } 
         if (!nfcAdapter.isEnabled()) { 
             promt.setText("请在系统设置中先启用NFC功能!"); 
             finish(); 
             return; 
         } 
     } 
  
     @Override 
     protected void onResume() { 
         super.onResume(); 
         //得到是否检测到ACTION_TECH_DISCOVERED触发  
         if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) { 
             //处理该intent  
             processIntent(getIntent()); 
         } 
     } 
     //字符序列转换为16进制字符串  
     private String bytesToHexString(byte[] src) { 
         StringBuilder stringBuilder = new StringBuilder("0x"); 
         if (src == null || src.length <= 0) { 
             return null; 
         } 
         char[] buffer = new char[2]; 
         for (int i = 0; i < src.length; i++) { 
             buffer[0] = Character.forDigit((src[i] >>> 4) & 0x0F, 16); 
             buffer[1] = Character.forDigit(src[i] & 0x0F, 16); 
             System.out.println(buffer); 
             stringBuilder.append(buffer); 
         } 
         return stringBuilder.toString(); 
     } 
  
     /**
      * Parses the NDEF Message from the intent and prints to the TextView
      */ 
     private void processIntent(Intent intent) { 
         //取出封装在intent中的TAG  
         Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
         for (String tech : tagFromIntent.getTechList()) { 
             System.out.println(tech); 
         } 
         boolean auth = false; 
         //读取TAG  
         MifareClassic mfc = MifareClassic.get(tagFromIntent); 
         try { 
             String metaInfo = ""; 
             //Enable I/O operations to the tag from this TagTechnology object.  
             mfc.connect(); 
             int type = mfc.getType();//获取TAG的类型  
             int sectorCount = mfc.getSectorCount();//获取TAG中包含的扇区数  
             String typeS = ""; 
             switch (type) { 
             case MifareClassic.TYPE_CLASSIC: 
                 typeS = "TYPE_CLASSIC"; 
                 break; 
             case MifareClassic.TYPE_PLUS: 
                 typeS = "TYPE_PLUS"; 
                 break; 
             case MifareClassic.TYPE_PRO: 
                 typeS = "TYPE_PRO"; 
                 break; 
             case MifareClassic.TYPE_UNKNOWN: 
                 typeS = "TYPE_UNKNOWN"; 
                 break; 
             } 
             metaInfo += "卡片类型:" + typeS + "\n共" + sectorCount + "个扇区\n共" 
                     + mfc.getBlockCount() + "个块\n存储空间: " + mfc.getSize() + "B\n"; 
             for (int j = 0; j < sectorCount; j++) { 
                 //Authenticate a sector with key A.  
                 auth = mfc.authenticateSectorWithKeyA(j, 
                         MifareClassic.KEY_DEFAULT); 
                 int bCount; 
                 int bIndex; 
                 if (auth) { 
                     metaInfo += "Sector " + j + ":验证成功\n"; 
                     // 读取扇区中的块  
                     bCount = mfc.getBlockCountInSector(j); 
                     bIndex = mfc.sectorToBlock(j); 
                     for (int i = 0; i < bCount; i++) { 
                         byte[] data = mfc.readBlock(bIndex); 
                         metaInfo += "Block " + bIndex + " : " 
                                 + bytesToHexString(data) + "\n"; 
                         bIndex++; 
                     } 
                 } else { 
                     metaInfo += "Sector " + j + ":验证失败\n"; 
                 } 
             } 
             promt.setText(metaInfo); 
         } catch (Exception e) { 
             e.printStackTrace(); 
         } 
     } 
 } 


但是在我实际使用中发现在onResume()中 if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(getIntent().getAction())) 后无法跳入processIntent函数中,我不明白为什么NfcAdapter.ACTION_TECH_DISCOVERED不等于getIntent().getAction(),所以各种求助!! --------------------编程问答-------------------- 怎么没发现你的onNewIntent在哪去了呢?
你可以参考这样:
    @Override
    public void onResume() {
        super.onResume();
        // Check to see that the Activity started due to an Android Beam
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
            processIntent(getIntent());
        }
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
    }
--------------------编程问答-------------------- 不知道楼主知道什么原因没有?能否指教一下 --------------------编程问答-------------------- NfcAdapter.ACTION_TECH_DISCOVERED=android.nfc.action.TECH_DISCOVERED,而getIntent().getAction()=android.intent.action.MAIN,只有当你进入onNewIntent才会相等
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,