日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android nfc读写demo,android nfc常用标签读取总结

發布時間:2023/12/9 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android nfc读写demo,android nfc常用标签读取总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有幾天沒有更新博客了,不過本篇卻準備了許久,希望能帶給每一位開發者最簡單高效的學習方式。廢話到此為止,下面開始正文。

NFC(Near Field Communication,近場通信)是一種數據傳輸技術。與Wi-Fi、藍牙、紅外線等數據傳輸技術的一個主要差異就是有效距離一般不能超過4厘米。但是NFC傳輸速度要比紅外快。目前NFC已經出現了一些應用,例如電子標簽識別、刷手機、點對點付款、身份識別、信息記錄等,本篇文章的目的是為大家揭開NFC標簽的面紗。

下面我們先從NFC的工作模式開始闡述NFC,開發NFC必先了解NFC。

1.NFC的工作模式

NFC支持如下3種工作模式:讀卡器模式(Reader/writer mode)、仿真卡模式(Card Emulation Mode)、點對點模式(P2P mode)。

下來分別看一下這三種模式:

(1)讀卡器模式

數據在NFC芯片中,可以簡單理解成“刷標簽”。本質上就是通過支持NFC的手機或其它電子設備從帶有NFC芯片的標簽、貼紙、名片等媒介中讀寫信息。通常NFC標簽是不需要外部供電的。當支持NFC的外設向NFC讀寫數據時,它會發送某種磁場,而這個磁場會自動的向NFC標簽供電。

(2)仿真卡模式

數據在支持NFC的手機或其它電子設備中,可以簡單理解成“刷手機”。本質上就是將支持NFC的手機或其它電子設備當成借記卡、公交卡、門禁卡等IC卡使用。基本原理是將相應IC卡中的信息憑證封裝成數據包存儲在支持NFC的外設中 。

在使用時還需要一個NFC射頻器(相當于刷卡器)。將手機靠近NFC射頻器,手機就會接收到NFC射頻器發過來的信號,在通過一系列復雜的驗證后,將IC卡的相應信息傳入NFC射頻器,最后這些IC卡數據會傳入NFC射頻器連接的電腦,并進行相應的處理(如電子轉帳、開門等操作)。

(3)點對點模式

該模式與藍牙、紅外差不多,用于不同NFC設備之間進行數據交換,不過這個模式已經沒有有“刷”的感覺了。其有效距離一般不能超過4厘米,但傳輸建立速度要比紅外和藍牙技術快很多,傳輸速度比紅外塊得多,如過雙方都使用Android4.2,NFC會直接利用藍牙傳輸。這種技術被稱為Android Beam。所以使用Android Beam傳輸數據的兩部設備不再限于4厘米之內。

點對點模式的典型應用是兩部支持NFC的手機或平板電腦實現數據的點對點傳輸,例如,交換圖片或同步設備聯系人。因此,通過NFC,多個設備如數字相機,計算機,手機之間,都可以快速連接,并交換資料或者服務。

下面看一下NFC、藍牙和紅外之間的差異:

對比項

NFC

藍牙

紅外

網絡類型

點對點

單點對多點

點對點

有效距離

<=0.1m

<=10m,最新的藍牙4.0有效距離可達100m

一般在1m以內,熱技術連接,不穩定

傳輸速度

最大424kbps

最大24Mbps

慢速115.2kbps,快速4Mbps

建立時間

<0.1s

6s

0.5s

安全性

安全,硬件實現

安全,軟件實現

不安全,使用IRFM時除外

通信模式

主動-主動/被動

主動-主動

主動-主動

成本

2.Android對NFC的支持

不同的NFC標簽之間差異很大,有的只支持簡單的讀寫操作,有時還會采用支持一次性寫入的芯片,將NFC標簽設計成只讀的。當然,也存在一些復雜的NFC標簽,例如,有一些NFC標簽可以通過硬件加密的方式限制對某一區域的訪問。還有一些標簽自帶操作環境,允許NFC設備與這些標簽進行更復雜的交互。這些標簽中的數據也會采用不同的格式。但Android SDK API主要支持NFC論壇標準(Forum Standard),這種標準被稱為NDEF(NFC Data Exchange Format,NFC數據交換格式)。

NDEF格式其實就類似于硬盤的NTFS,下面我們看一下NDEF數據:

(1)NDEF數據的操作

Android SDK API支持如下3種NDEF數據的操作:

1)從NFC標簽讀取NDEF格式的數據。

2)向NFC標簽寫入NDEF格式的數據。

3)通過Android Beam技術將NDEF數據發送到另一部NFC設備。

用于描述NDEF格式數據的兩個類:

1)NdefMessage:描述NDEF格式的信息,實際上我們寫入NFC標簽的就是NdefMessage對象。

2)NdefRecord:描述NDEF信息的一個信息段,一個NdefMessage可能包含一個或者多個NdefRecord。

NdefMessage和NdefRecord是Android NFC技術的核心類,無論讀寫NDEF格式的NFC標簽,還是通過Android Beam技術傳遞Ndef格式的數據,都需要這兩個類。

(2)非NDEF數據的操作

對于某些特殊需求,可能要存任意的數據,對于這些數據,我們就需要自定義格式。這些數據格式實際上就是普通的字節流,至于字節流中的數據代表什么,就由開發人員自己定義了。

(3)編寫NFC程序的基本步驟

1)設置權限,限制Android版本、安裝的設備:

2)定義可接收Tag的Activity

Activity清單需要配置一下launchMode屬性:

android:name=".TagTextActivity"

android:launchMode="singleTop"/>

而Activity中,我們也抽取了一個通用的BaseNfcActivity,如下(后面的Activity實現都繼承于BaseNfcActivity):

/**

* 1.子類需要在onCreate方法中做Activity初始化。

* 2.子類需要在onNewIntent方法中進行NFC標簽相關操作。

* 當launchMode設置為singleTop時,第一次運行調用onCreate方法,

* 第二次運行將不會創建新的Activity實例,將調用onNewIntent方法

* 所以我們獲取intent傳遞過來的Tag數據操作放在onNewIntent方法中執行

* 如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的onNewIntent())

* 只要NFC標簽靠近就執行

*/

public class BaseNfcActivity extends AppCompatActivity {

private NfcAdapter mNfcAdapter;

private PendingIntent mPendingIntent;

/**

* 啟動Activity,界面可見時

*/

@Override

protected void onStart() {

super.onStart();

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

//一旦截獲NFC消息,就會通過PendingIntent調用窗口

mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);

}

/**

* 獲得焦點,按鈕可以點擊

*/

@Override

public void onResume() {

super.onResume();

//設置處理優于所有其他NFC的處理

if (mNfcAdapter != null)

mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);

}

/**

* 暫停Activity,界面獲取焦點,按鈕可以點擊

*/

@Override

public void onPause() {

super.onPause();

//恢復默認狀態

if (mNfcAdapter != null)

mNfcAdapter.disableForegroundDispatch(this);

}

}

注意:通常來說,所有處理NFC的Activity都要設置launchMode屬性為singleTop或者singleTask,保證了無論NFC標簽靠近手機多少次,Activity實例只有一個。

接下來看幾個具體的NFC標簽應用實例,通過情景學習快速掌握NFC技術:

3.兩個NFC標簽的簡單實例

1.利用NFC標簽讓Android自動運行程序

場景是這樣的:現將應用程序的包寫到NFC程序上,然后我們將NFC標簽靠近Android手機,手機就會自動運行包所對應的程序,這個是NFC比較基本的一個應用。下面以貼近標簽自動運行Android自帶的“短信”為例。

向NFC標簽寫入數據一般分為三步:

1)獲取Tag對象

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

2)判斷NFC標簽的數據類型(通過Ndef.get方法)

Ndef ndef = Ndef.get(tag);

3)寫入數據

ndef.writeNdefMessage(ndefMessage);

詳細實現代碼如下:

public class RunAppActivity extends BaseNfcActivity{

private String mPackageName = "com.android.mms";//短信

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

@Override

public void onNewIntent(Intent intent) {

if (mPackageName == null)

return;

//1.獲取Tag對象

Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

writeNFCTag(detectedTag);

}

/**

* 往標簽寫數據的方法

*

* @param tag

*/

public void writeNFCTag(Tag tag) {

if (tag == null) {

return;

}

NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord

.createApplicationRecord(mPackageName)});

//轉換成字節獲得大小

int size = ndefMessage.toByteArray().length;

try {

//2.判斷NFC標簽的數據類型(通過Ndef.get方法)

Ndef ndef = Ndef.get(tag);

//判斷是否為NDEF標簽

if (ndef != null) {

ndef.connect();

//判斷是否支持可寫

if (!ndef.isWritable()) {

return;

}

//判斷標簽的容量是否夠用

if (ndef.getMaxSize() < size) {

return;

}

//3.寫入數據

ndef.writeNdefMessage(ndefMessage);

Toast.makeText(this, "寫入成功", Toast.LENGTH_SHORT).show();

} else { //當我們買回來的NFC標簽是沒有格式化的,或者沒有分區的執行此步

//Ndef格式類

NdefFormatable format = NdefFormatable.get(tag);

//判斷是否獲得了NdefFormatable對象,有一些標簽是只讀的或者不允許格式化的

if (format != null) {

//連接

format.connect();

//格式化并將信息寫入標簽

format.format(ndefMessage);

Toast.makeText(this, "寫入成功", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(this, "寫入失敗", Toast.LENGTH_SHORT).show();

}

}

} catch (Exception e) {

}

}

}

注意:設置 RunAppActivity 的 launchMode 屬性為 singleTop。

現在看一下效果圖:

將NFC標簽貼近手機背面,自動寫入數據,此時退出所有程序,返回桌面,然后再將NFC標簽貼近手機背面,將會看到自動打開了“短信”。

下來再看一個有趣的例子:

2.利用NFC標簽讓Android自動打開網頁

如何讓NFC標簽貼近手機,手機可以自動打開一個網頁呢?

首先我們創建一個NdefRecord,Android已經為我們提供好了這樣的方法:

//直接接受一個Uri

public NdefRecord createUri(String uriString);

//接受一個Uri的對象

public NdefRecord createUri(Uri uri);

實現代碼對比“3.利用NFC標簽讓Android自動運行程序”部分只是修改了writeNFCTag方法中

NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord

.createApplicationRecord(mPackageName)});

NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{NdefRecord

.createUri(Uri.parse(http://www.baidu.com))});

其余不變。

上面這個功能還是比較有用的,例如我們往某些商品上貼上NFC標簽,里面寫入該商品的詳細介紹網頁Uri,當用戶貼近商品時,就會自動打開該商品的詳情介紹。

通過上面這兩個案例的學習相信很多人已經對NFC感起了興趣,那么下來滲透式的分析一下NDEF文本格式,看看NDEF到底是個什么東西。

4.NDEF文本格式深度解析

獲取NFC標簽中的數據要通過 NdefRecord.getPayload 方法完成。當然,在處理這些數據之前,最好判斷一下NdefRecord對象中存儲的是不是NDEF文本格式數據。

(1)判斷數據是否為NDEF格式

1)TNF(類型名格式,Type Name Format)必須是NdefRecord.TNF_WELL_KNOWN。

2)可變的長度類型必須是NdefRecord.RTD_TEXT。

如果這兩個標準同時滿足,那么就為NDEF格式。

(2)NDEF文本格式規范

不管什么格式的數據本質上都是由一些字節組成的。對于NDEF文本格式來說,這些數據的第1個字節描述了數據的狀態,然后若干個字節描述文本的語言編碼,最后剩余字節表示文本數據。這些數據格式由NFC Forum的相關規范定義,可以通過 http://members.nfc-forum.org/specs/spec_dashboard 下載相關的規范。

下面這兩張表是規范中 3.2節 相對重要的翻譯部分:

NDEF文本數據格式:

偏移量

長度(bytes)

描述

0

1

狀態字節,見下表(狀態字節編碼格式)

1

n

ISO/IANA語言編碼。例如”en-US”,”fr-CA”。編碼格式是US-ASCII,長度(n)由狀態字節的后6位指定。

n+1

m

文本數據。編碼格式是UTF-8或UTF-16。編碼格式由狀態字節的前3位指定。

狀態字節編碼格式:

字節位(0是最低位,7是最高位)

含義

7

0:文本編碼為UTF-8,1:文本編碼為UTF-16

6

必須設為0

5..0

語言編碼的長度(占用的字節個數)

下面我們動手實現NFC標簽中的文本數據的讀寫操作:

1.讀NFC標簽文本數據

public class ReadTextActivity extends BaseNfcActivity {

private TextView mNfcText;

private String mTagText;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_read_text);

mNfcText = (TextView) findViewById(R.id.tv_nfctext);

}

@Override

public void onNewIntent(Intent intent) {

//1.獲取Tag對象

Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

//2.獲取Ndef的實例

Ndef ndef = Ndef.get(detectedTag);

mTagText = ndef.getType() + "\nmaxsize:" + ndef.getMaxSize() + "bytes\n\n";

readNfcTag(intent);

mNfcText.setText(mTagText);

}

/**

* 讀取NFC標簽文本數據

*/

private void readNfcTag(Intent intent) {

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(

NfcAdapter.EXTRA_NDEF_MESSAGES);

NdefMessage msgs[] = null;

int contentSize = 0;

if (rawMsgs != null) {

msgs = new NdefMessage[rawMsgs.length];

for (int i = 0; i < rawMsgs.length; i++) {

msgs[i] = (NdefMessage) rawMsgs[i];

contentSize += msgs[i].toByteArray().length;

}

}

try {

if (msgs != null) {

NdefRecord record = msgs[0].getRecords()[0];

String textRecord = parseTextRecord(record);

mTagText += textRecord + "\n\ntext\n" + contentSize + " bytes";

}

} catch (Exception e) {

}

}

}

/**

* 解析NDEF文本數據,從第三個字節開始,后面的文本數據

* @param ndefRecord

* @return

*/

public static String parseTextRecord(NdefRecord ndefRecord) {

/**

* 判斷數據是否為NDEF格式

*/

//判斷TNF

if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {

return null;

}

//判斷可變的長度的類型

if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {

return null;

}

try {

//獲得字節數組,然后進行分析

byte[] payload = ndefRecord.getPayload();

//下面開始NDEF文本數據第一個字節,狀態字節

//判斷文本是基于UTF-8還是UTF-16的,取第一個字節"位與"上16進制的80,16進制的80也就是最高位是1,

//其他位都是0,所以進行"位與"運算后就會保留最高位

String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8" : "UTF-16";

//3f最高兩位是0,第六位是1,所以進行"位與"運算后獲得第六位

int languageCodeLength = payload[0] & 0x3f;

//下面開始NDEF文本數據第二個字節,語言編碼

//獲得語言編碼

String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");

//下面開始NDEF文本數據后面的字節,解析出文本

String textRecord = new String(payload, languageCodeLength + 1,

payload.length - languageCodeLength - 1, textEncoding);

return textRecord;

} catch (Exception e) {

throw new IllegalArgumentException();

}

}

}

注意:Activity清單需要配置一下launchMode屬性(后面一樣要注意):

android:name=".ReadTextActivity"

android:launchMode="singleTop"/>

2.寫NFC標簽文本數據

public class WriteTextActivity extends BaseNfcActivity {

private String mText = "NFC-NewText-123";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_write_text);

}

@Override

public void onNewIntent(Intent intent) {

if (mText == null)

return;

//獲取Tag對象

Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

NdefMessage ndefMessage = new NdefMessage(

new NdefRecord[] { createTextRecord(mText) });

boolean result = writeTag(ndefMessage, detectedTag);

if (result){

Toast.makeText(this, "寫入成功", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(this, "寫入失敗", Toast.LENGTH_SHORT).show();

}

}

/**

* 創建NDEF文本數據

* @param text

* @return

*/

public static NdefRecord createTextRecord(String text) {

byte[] langBytes = Locale.CHINA.getLanguage().getBytes(Charset.forName("US-ASCII"));

Charset utfEncoding = Charset.forName("UTF-8");

//將文本轉換為UTF-8格式

byte[] textBytes = text.getBytes(utfEncoding);

//設置狀態字節編碼最高位數為0

int utfBit = 0;

//定義狀態字節

char status = (char) (utfBit + langBytes.length);

byte[] data = new byte[1 + langBytes.length + textBytes.length];

//設置第一個狀態字節,先將狀態碼轉換成字節

data[0] = (byte) status;

//設置語言編碼,使用數組拷貝方法,從0開始拷貝到data中,拷貝到data的1到langBytes.length的位置

System.arraycopy(langBytes, 0, data, 1, langBytes.length);

//設置文本字節,使用數組拷貝方法,從0開始拷貝到data中,拷貝到data的1 + langBytes.length

//到textBytes.length的位置

System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);

//通過字節傳入NdefRecord對象

//NdefRecord.RTD_TEXT:傳入類型 讀寫

NdefRecord ndefRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,

NdefRecord.RTD_TEXT, new byte[0], data);

return ndefRecord;

}

/**

* 寫數據

* @param ndefMessage 創建好的NDEF文本數據

* @param tag 標簽

* @return

*/

public static boolean writeTag(NdefMessage ndefMessage, Tag tag) {

try {

Ndef ndef = Ndef.get(tag);

ndef.connect();

ndef.writeNdefMessage(ndefMessage);

return true;

} catch (Exception e) {

}

return false;

}

}

我們將手機貼近NFC標簽,當寫入成功會彈出“寫入成功”的吐司。下面我們再驗證一下是否成功寫入:

我們看到,數據已經寫入成功了,說明到此我們已經成功的讀寫NFC標簽中的文本數據了。

5.NDEF Uri格式深度解析

(1)Uri的格式規范要比文本格式簡單一些:

Name

偏移

大小

描述

識別碼

0

1byte

Uri識別碼

用于存儲已知Uri的前綴

Uri字段

1

N

UTF-8類型字符串

用于存儲剩余字符串

(2)Uri的前綴如下(都是十六進制的一個數):

十進制

十六進制

協議

十進制

十六進制

協議

0

0x00

N/A

1

0x01

2

0x02

3

0x03

http://

4

0x04

https://

5

0x05

tel:

8

0x08

9

0x09

ftps://

10

0x0A

sftp://

11

0x0B

smb://

12

0x0C

nfs://

13

0x0D

ftp://

14

0x0E

dav://

15

0x0F

news:

16

0x10

telnet://

17

0x11

imap:

18

0x12

rtsp://

19

0x13

urn:

20

0x14

pop:

21

0x15

sip:

22

0x16

sips:

23

0x17

tftp:

24

0x18

btspp://

25

0x19

btl2cap://

26

0x1A

btgoep://

27

0x1B

tcpobex://

28

0x1C

irdaobex://

29

0x1D

file://

30

0x1E

urn:epc:id:

31

0x1F

urn:epc:tag:

32

0x20

urn:epc:pat:

33

0x21

urn:epc:raw:

34

0x22

urn:epc:

35

0x23

urn:nfc:

每一個協議,都是用十六進制來存儲于識別碼位置(占1byte)。

是不是相對簡單了些,那么下來我們來解析一個Uri。

(3)預先定義已知Uri前綴

這里我們定義一個UriPrefix類,以便方便的獲取Uri前綴:

public class UriPrefix {

public static final Map URI_PREFIX_MAP = new HashMap();

// 預先定義已知Uri前綴

static {

URI_PREFIX_MAP.put((byte) 0x00, "");

URI_PREFIX_MAP.put((byte) 0x01, "http://www.");

URI_PREFIX_MAP.put((byte) 0x02, "https://www.");

URI_PREFIX_MAP.put((byte) 0x03, "http://");

URI_PREFIX_MAP.put((byte) 0x04, "https://");

URI_PREFIX_MAP.put((byte) 0x05, "tel:");

URI_PREFIX_MAP.put((byte) 0x06, "mailto:");

URI_PREFIX_MAP.put((byte) 0x07, "ftp://anonymous:anonymous@");

URI_PREFIX_MAP.put((byte) 0x08, "ftp://ftp.");

URI_PREFIX_MAP.put((byte) 0x09, "ftps://");

URI_PREFIX_MAP.put((byte) 0x0A, "sftp://");

URI_PREFIX_MAP.put((byte) 0x0B, "smb://");

URI_PREFIX_MAP.put((byte) 0x0C, "nfs://");

URI_PREFIX_MAP.put((byte) 0x0D, "ftp://");

URI_PREFIX_MAP.put((byte) 0x0E, "dav://");

URI_PREFIX_MAP.put((byte) 0x0F, "news:");

URI_PREFIX_MAP.put((byte) 0x10, "telnet://");

URI_PREFIX_MAP.put((byte) 0x11, "imap:");

URI_PREFIX_MAP.put((byte) 0x12, "rtsp://");

URI_PREFIX_MAP.put((byte) 0x13, "urn:");

URI_PREFIX_MAP.put((byte) 0x14, "pop:");

URI_PREFIX_MAP.put((byte) 0x15, "sip:");

URI_PREFIX_MAP.put((byte) 0x16, "sips:");

URI_PREFIX_MAP.put((byte) 0x17, "tftp:");

URI_PREFIX_MAP.put((byte) 0x18, "btspp://");

URI_PREFIX_MAP.put((byte) 0x19, "btl2cap://");

URI_PREFIX_MAP.put((byte) 0x1A, "btgoep://");

URI_PREFIX_MAP.put((byte) 0x1B, "tcpobex://");

URI_PREFIX_MAP.put((byte) 0x1C, "irdaobex://");

URI_PREFIX_MAP.put((byte) 0x1D, "file://");

URI_PREFIX_MAP.put((byte) 0x1E, "urn:epc:id:");

URI_PREFIX_MAP.put((byte) 0x1F, "urn:epc:tag:");

URI_PREFIX_MAP.put((byte) 0x20, "urn:epc:pat:");

URI_PREFIX_MAP.put((byte) 0x21, "urn:epc:raw:");

URI_PREFIX_MAP.put((byte) 0x22, "urn:epc:");

URI_PREFIX_MAP.put((byte) 0x23, "urn:nfc:");

}

}

然后我們來看一下清單文件中Activity的相關配置:

android:name=".ReadWriteUriActivity"

android:label="讀寫NFC標簽的Uri"

android:launchMode="singleTop" >

好了,接下來就可以進行讀寫NFC標簽中的Uri數據了:

1.讀NFC標簽中的Uri數據

public class ReadUriActivity extends BaseNfcActivity {

private TextView mNfcText;

private String mTagText;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_read_uri);

mNfcText = (TextView) findViewById(R.id.tv_nfctext);

}

@Override

public void onNewIntent(Intent intent) {

//獲取Tag對象

Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

//獲取Ndef的實例

Ndef ndef = Ndef.get(detectedTag);

mTagText = ndef.getType() + "\n max size:" + ndef.getMaxSize() + " bytes\n\n";

readNfcTag(intent);

mNfcText.setText(mTagText);

}

/**

* 讀取NFC標簽Uri

*/

private void readNfcTag(Intent intent) {

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(

NfcAdapter.EXTRA_NDEF_MESSAGES);

NdefMessage ndefMessage = null;

int contentSize = 0;

if (rawMsgs != null) {

if (rawMsgs.length > 0) {

ndefMessage = (NdefMessage) rawMsgs[0];

contentSize = ndefMessage.toByteArray().length;

} else {

return;

}

}

try {

NdefRecord ndefRecord = ndefMessage.getRecords()[0];

Log.i("JAVA",ndefRecord.toString());

Uri uri = parse(ndefRecord);

Log.i("JAVA","uri:"+uri.toString());

mTagText += uri.toString() + "\n\nUri\n" + contentSize + " bytes";

} catch (Exception e) {

}

}

}

/**

* 解析NdefRecord中Uri數據

* @param record

* @return

*/

public static Uri parse(NdefRecord record) {

short tnf = record.getTnf();

if (tnf == NdefRecord.TNF_WELL_KNOWN) {

return parseWellKnown(record);

} else if (tnf == NdefRecord.TNF_ABSOLUTE_URI) {

return parseAbsolute(record);

}

throw new IllegalArgumentException("Unknown TNF " + tnf);

}

/**

* 處理絕對的Uri

* 沒有Uri識別碼,也就是沒有Uri前綴,存儲的全部是字符串

* @param ndefRecord 描述NDEF信息的一個信息段,一個NdefMessage可能包含一個或者多個NdefRecord

* @return

*/

private static Uri parseAbsolute(NdefRecord ndefRecord) {

//獲取所有的字節數據

byte[] payload = ndefRecord.getPayload();

Uri uri = Uri.parse(new String(payload, Charset.forName("UTF-8")));

return uri;

}

/**

* 處理已知類型的Uri

* @param ndefRecord

* @return

*/

private static Uri parseWellKnown(NdefRecord ndefRecord) {

//判斷數據是否是Uri類型的

if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_URI))

return null;

//獲取所有的字節數據

byte[] payload = ndefRecord.getPayload();

String prefix = UriPrefix.URI_PREFIX_MAP.get(payload[0]);

byte[] prefixBytes = prefix.getBytes(Charset.forName("UTF-8"));

byte[] fullUri = new byte[prefixBytes.length + payload.length - 1];

System.arraycopy(prefixBytes, 0, fullUri, 0, prefixBytes.length);

System.arraycopy(payload, 1, fullUri, prefixBytes.length, payload.length - 1);

Uri uri = Uri.parse(new String(fullUri, Charset.forName("UTF-8")));

return uri;

}

}

2.寫NFC標簽中的Uri數據

public class WriteUriActivity extends BaseNfcActivity {

private String mUri = "http://www.baidu.com";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_write_uri);

}

public void onNewIntent(Intent intent) {

Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{createUriRecord(mUri)});

boolean result = writeTag(ndefMessage, detectedTag);

if (result){

Toast.makeText(this, "寫入成功", Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(this, "寫入失敗", Toast.LENGTH_SHORT).show();

}

}

/**

* 將Uri轉成NdefRecord

* @param uriStr

* @return

*/

public static NdefRecord createUriRecord(String uriStr) {

byte prefix = 0;

for (Byte b : UriPrefix.URI_PREFIX_MAP.keySet()) {

String prefixStr = UriPrefix.URI_PREFIX_MAP.get(b).toLowerCase();

if ("".equals(prefixStr))

continue;

if (uriStr.toLowerCase().startsWith(prefixStr)) {

prefix = b;

uriStr = uriStr.substring(prefixStr.length());

break;

}

}

byte[] data = new byte[1 + uriStr.length()];

data[0] = prefix;

System.arraycopy(uriStr.getBytes(), 0, data, 1, uriStr.length());

NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], data);

return record;

}

/**

* 寫入標簽

* @param message

* @param tag

* @return

*/

public static boolean writeTag(NdefMessage message, Tag tag) {

int size = message.toByteArray().length;

try {

Ndef ndef = Ndef.get(tag);

if (ndef != null) {

ndef.connect();

if (!ndef.isWritable()) {

return false;

}

if (ndef.getMaxSize() < size) {

return false;

}

ndef.writeNdefMessage(message);

return true;

}

} catch (Exception e) {

}

return false;

}

}

我們將手機貼近NFC標簽,寫入成功后驗證一下是否成功寫入:

我們看到,數據已經寫入成功了,說明到此我們已經成功的讀寫NFC標簽中的Uri數據了。

到這里,NDEF格式就大致說完了,那么接下來看一下非NDEF格式的數據。

6.非NDEF格式深度解析

1.MifareUltralight數據格式

將NFC標簽的存儲區域分為16個頁,每一個頁可以存儲4個字節,一個可存儲64個字節(512位)。頁碼從0開始(0至15)。前4頁(0至3)存儲了NFC標簽相關的信息(如NFC標簽的序列號、控制位等)。從第5頁開始存儲實際的數據(4至15頁)。

使用MifareUltralight.get方法獲取MifareUltralight對象,然后調用MifareUltralight.connect方法進行連接,并使用MifareUltralight.writePage方法每次寫入1頁(4個字節)。也可以使用MifareUltralight.readPages方法每次連續讀取4頁。如果讀取的頁的序號超過15,則從頭開始讀。例如,從第15頁(序號為14)開始讀。readPages方法會讀取14、15、0、1頁的數據。

2.讀MifareUltralight格式數據

public class ReadMUActivity extends BaseNfcActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_read_mu);

}

@Override

public void onNewIntent(Intent intent) {

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

String[] techList = tag.getTechList();

boolean haveMifareUltralight = false;

for (String tech : techList) {

if (tech.indexOf("MifareUltralight") >= 0) {

haveMifareUltralight = true;

break;

}

}

if (!haveMifareUltralight) {

Toast.makeText(this, "不支持MifareUltralight數據格式", Toast.LENGTH_SHORT).show();

return;

}

String data = readTag(tag);

if (data != null)

Toast.makeText(this, data, Toast.LENGTH_SHORT).show();

}

public String readTag(Tag tag) {

MifareUltralight ultralight = MifareUltralight.get(tag);

try {

ultralight.connect();

byte[] data = ultralight.readPages(4);

return new String(data, Charset.forName("GB2312"));

} catch (Exception e) {

} finally {

try {

ultralight.close();

} catch (Exception e) {

}

}

return null;

}

}

3.寫MifareUltralight格式數據

public class WriteMUActivity extends BaseNfcActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_write_mu);

}

@Override

public void onNewIntent(Intent intent) {

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

String[] techList = tag.getTechList();

boolean haveMifareUltralight = false;

for (String tech : techList) {

if (tech.indexOf("MifareUltralight") >= 0) {

haveMifareUltralight = true;

break;

}

}

if (!haveMifareUltralight) {

Toast.makeText(this, "不支持MifareUltralight數據格式", Toast.LENGTH_SHORT).show();

return;

}

writeTag(tag);

}

public void writeTag(Tag tag) {

MifareUltralight ultralight = MifareUltralight.get(tag);

try {

ultralight.connect();

//寫入八個漢字,從第五頁開始寫,中文需要轉換成GB2312格式

ultralight.writePage(4, "北京".getBytes(Charset.forName("GB2312")));

ultralight.writePage(5, "上海".getBytes(Charset.forName("GB2312")));

ultralight.writePage(6, "廣州".getBytes(Charset.forName("GB2312")));

ultralight.writePage(7, "天津".getBytes(Charset.forName("GB2312")));

Toast.makeText(this, "寫入成功", Toast.LENGTH_SHORT).show();

} catch (Exception e) {

} finally {

try {

ultralight.close();

} catch (Exception e) {

}

}

}

}

我們將手機貼近NFC標簽,寫入成功后驗證一下是否成功寫入:

我們看到,彈出了“北京上海廣州天津”,說明數據已經寫入成功了,說明到此我們已經成功的讀寫NFC非NDEF格式的數據了。

源碼下載:demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的android nfc读写demo,android nfc常用标签读取总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

夜夜操天天 | 久久精品屋 | 久久久国产毛片 | 亚洲成aⅴ人片久久青草影院 | 国产精品一区二区久久国产 | 九九九视频在线 | 嫩草av影院 | 玖玖在线播放 | 免费中文字幕在线观看 | 久久久2o19精品 | 高清不卡一区二区三区 | 99视频精品免费视频 | 91高清视频免费 | 激情综合色图 | 婷婷激情欧美 | 国产中文字幕在线播放 | 精品国产免费观看 | 国产日韩av在线 | 日本中文字幕免费观看 | 欧美一区二区精美视频 | 久久97视频 | 日韩黄色免费在线观看 | 激情欧美丁香 | 在线黄色av | 久久99久久99精品免观看粉嫩 | 成人在线网站观看 | 亚洲欧美日本国产 | 免费能看的av | 一级成人在线 | 欧美资源在线观看 | 免费观看成人网 | 日韩在线观看精品 | 伊人中文字幕在线 | 91毛片视频| a在线观看国产 | 深夜免费福利视频 | 国产高清不卡一区二区三区 | 欧美另类性 | 久精品在线观看 | 在线观看av中文字幕 | 91麻豆精品国产91久久久使用方法 | 麻豆一区在线观看 | 国产精品美女久久久久久网站 | 亚洲视频综合在线 | 中文字幕在线观看2018 | 亚洲成人影音 | 香蕉影院在线观看 | 91亚色视频在线观看 | 国产精品电影一区二区 | 亚洲成人在线免费 | 免费精品在线视频 | 国内精品久久久久久久影视麻豆 | 2021国产在线 | 国产精品原创av片国产免费 | 在线综合色 | www激情久久 | 天天操天天干天天操天天干 | 五月婷婷爱| 九九免费观看视频 | 免费久久久久久 | 97精品国产91久久久久久久 | 亚洲一区二区视频 | 欧洲av在线| 中文国产在线观看 | 五月婷婷另类国产 | 一区二区激情 | 人人干人人添 | 天天天操操操 | 久久婷婷亚洲 | 四虎4hu永久免费 | 九九热在线精品 | 国产精品九九久久久久久久 | 91精品麻豆 | 国产高清一区二区 | 免费看的黄色小视频 | 久久看毛片 | 久久久999精品视频 国产美女免费观看 | 一区二区三区动漫 | 久久午夜精品视频 | 国产精品久久精品国产 | 亚洲专区在线视频 | 国产在线视频导航 | 在线免费观看成人 | 在线影院 国内精品 | 女人18精品一区二区三区 | 欧美日韩国产精品一区二区三区 | 狠狠干天天射 | 色综合色综合色综合 | 久久夜色精品国产欧美一区麻豆 | 国产 欧美 日韩 | 2019天天干夜夜操 | 日韩美女久久 | 精品久久久久久亚洲 | 在线探花| 中文字幕资源网 国产 | 免费视频91| 久久99国产精品免费 | 久久免费国产精品 | 草久草久 | 欧美激情视频一区二区三区免费 | 国产精品一区二区av麻豆 | 久久国产经典视频 | 九九九九九精品 | 久草在线资源观看 | 国产96在线| 国产一区二区三区免费在线观看 | 免费欧美 | 高清视频一区二区三区 | 日韩黄色在线电影 | 国产亚洲精品精品精品 | 91系列在线观看 | 精品国产视频在线 | 久久久久麻豆v国产 | h视频在线看 | 一本一道久久a久久精品 | 色综合天天在线 | 精品视频在线播放 | 欧美地下肉体性派对 | 黄色大片av| 亚洲中字幕 | 五月天激情综合网 | 久久字幕精品一区 | 在线看v片 | 午夜精品久久久久久久99 | 国产精品美女在线观看 | 天天视频色| 欧美极度另类性三渗透 | av电影 一区二区 | 国产福利午夜 | av电影亚洲 | 在线视频在线观看 | 精品乱码一区二区三四区 | 婷婷激情五月综合 | 在线观看一区二区视频 | 亚洲视频专区在线 | 黄色三级av| 在线天堂8√ | 国产一区在线免费观看视频 | 日韩天堂在线观看 | 久久久资源 | 91精品影视 | 国产精品18久久久久久不卡孕妇 | 亚洲黄色软件 | 93久久精品日日躁夜夜躁欧美 | 中文字幕av日韩 | 亚洲天堂网站 | 日韩免费高清在线 | 免费视频久久 | 黄色网址国产 | 麻豆精品视频在线观看免费 | 黄色成人免费电影 | 久久爱影视i | 网址你懂的在线观看 | 欧美视频xxx | 九九免费精品 | 亚洲精品免费在线播放 | 欧美在线视频不卡 | 天天玩天天干 | 亚洲精品91天天久久人人 | 久久国内精品视频 | 亚洲精品高清视频 | 99精品黄色片免费大全 | 日韩资源在线播放 | 免费黄色在线网址 | 中文字幕制服丝袜av久久 | 欧美va天堂va视频va在线 | 99婷婷狠狠成为人免费视频 | 久久人人爽人人爽人人 | 亚洲 欧美 国产 va在线影院 | 天堂在线免费视频 | 成全在线视频免费观看 | 亚洲高清视频一区二区三区 | 99久热在线精品视频观看 | 久久天天综合网 | 精产嫩模国品一二三区 | 欧美日韩国产一区二区在线观看 | 久久国产成人午夜av影院宅 | 天天综合导航 | 久久国产片 | 精品欧美一区二区精品久久 | 99在线热播 | 五月天.com | 天天干天天做 | 国产精品一区二区av日韩在线 | 国产免费观看av | 国产高清免费在线观看 | 91中文在线视频 | 片网址 | 亚洲在线成人精品 | 色中文字幕在线观看 | 日韩乱码中文字幕 | 精品国产一区二区在线 | 国产精品 中文字幕 亚洲 欧美 | 日韩免费区 | 国产永久免费 | 国产打女人屁股调教97 | 91夫妻视频 | 亚洲精品国产精品乱码不99热 | 深爱综合网 | 国产一级电影免费观看 | 免费观看日韩av | 日韩成年视频 | 天天干天天操天天搞 | 一级黄色片在线 | 成人影视免费看 | 婷婷在线精品视频 | 99在线免费视频观看 | 国产成人av免费在线观看 | 欧美男同网站 | 欧美一区在线看 | 91成人网在线播放 | 中文字幕在线专区 | 亚洲高清视频在线观看免费 | 午夜精品一二三区 | 免费成人av电影 | 9999免费视频 | 久久综合五月天 | 91影视成人| 精品国模一区二区三区 | 久久精品国产精品亚洲 | 亚洲免费在线观看视频 | 国产91精品欧美 | 日韩在线观看视频一区二区三区 | 日韩视频1区 | 一区二区三区四区五区六区 | 国产精彩在线视频 | 又大又硬又黄又爽视频在线观看 | 91在线免费观看国产 | 香蕉网在线观看 | 超级碰碰碰视频 | 免费看一及片 | 在线观看免费成人 | 欧美黄色软件 | 中文字幕日韩精品有码视频 | 国内精品福利视频 | 久久精品中文字幕一区二区三区 | 狠狠狠狠狠狠干 | 四虎影视精品成人 | 婷婷久久综合九色综合 | 天天干天天操天天爱 | 亚洲精品色视频 | 亚洲国产精品激情在线观看 | 国产精品婷婷午夜在线观看 | 日韩va欧美va亚洲va久久 | 亚洲欧美va | 日韩av免费一区二区 | 欧美一级电影在线观看 | 色噜噜在线观看 | 久草在线视频在线 | 亚洲黄色一级大片 | 91久久丝袜国产露脸动漫 | 色多多在线观看 | 欧美成人久久 | 中文字幕av有码 | 97在线观看免费观看 | 在线观看中文字幕网站 | 九九热在线观看视频 | 色婷婷成人网 | www.啪啪.com | 免费一区在线 | 国产精品99精品久久免费 | 五月激情站 | 在线免费观看的av网站 | 日韩黄色一级电影 | 国产精品色 | 久久久久久久综合色一本 | 在线成人一区 | 五月天色站 | 久久精品久久精品久久精品 | 久久久96| 欧美男同视频网站 | 天天玩夜夜操 | 久久精品国产美女 | www.eeuss影院av撸 | 91视频啪 | 日本少妇高清做爰视频 | 伊人天天干| 久久久精品一区二区三区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 日韩深夜在线观看 | 在线观看黄av | www亚洲视频 | 欧美福利网站 | 亚洲一区日韩在线 | 久久中文精品视频 | 少妇高潮冒白浆 | 黄色小说18| 成人毛片久久 | 九九热精品在线 | 亚洲精品免费观看视频 | 国产黄a三级 | 亚洲成人免费 | 成人a视频 | 亚洲国产精品免费 | 久草免费电影 | 超薄丝袜一二三区 | 日韩欧美精品在线观看 | 99视频精品视频高清免费 | 中文字幕精品一区久久久久 | 久久国产精品视频免费看 | 成人在线视频观看 | 99看视频在线观看 | 国产视频欧美视频 | 日日夜夜狠狠干 | 欧美日韩在线播放 | 在线视频福利 | 狠狠干激情 | 日韩中文幕 | 一区二区三区日韩精品 | 欧美在线一级片 | 91麻豆福利| 亚洲国产精品人久久电影 | 久久国产视屏 | 天无日天天操天天干 | 国产精品毛片一区二区在线看 | 精品国产一区二区在线 | 91亚洲精品乱码久久久久久蜜桃 | 久久九九精品 | 一二三区视频在线 | 国产vs久久 | www..com毛片 | 久久综合九色综合网站 | 日韩簧片在线观看 | 国产综合精品久久 | 国产精品少妇 | 99国产视频 | 啪啪午夜免费 | 99色国产| 欧美精品一区二区在线观看 | 99精品在线视频播放 | 成年人网站免费在线观看 | 免费影视大全推荐 | 成人久久综合 | 亚洲黄色免费在线看 | 国产黄色一级片在线 | 日韩av影片在线观看 | 精品国产伦一区二区三区免费 | 91精品免费在线观看 | 天天弄天天操 | 国产精品第54页 | 国产精品综合久久久久 | 99操视频 | 91亚洲网站| 在线观看国产福利片 | 国产黄a三级| 国产人成一区二区三区影院 | 天天操夜操 | 久久一区二区免费视频 | 免费看一及片 | 91久草视频 | 亚洲精品视频在线 | 色播五月激情五月 | 黄a在线看 | 一区二区观看 | 免费观看9x视频网站在线观看 | 丁香婷婷综合激情 | 米奇影视7777 | 在线视频一区二区 | www.色婷婷 | 久久婷婷精品 | 天天色播| 亚洲免费不卡 | 婷婷久久综合九色综合 | 亚洲理论电影网 | 久久国色夜色精品国产 | 国产精品成人aaaaa网站 | 操操操av | 91污污视频在线观看 | 狠狠色丁香久久婷婷综 | 99久久精品国 | 中文字幕在线播放一区二区 | 欧美成人理伦片 | 国产最新视频在线 | 色姑娘综合天天 | 中文字幕在线免费观看视频 | 97超碰国产精品 | 亚洲理论在线观看 | 国产亚洲视频系列 | 久久综合干 | 三级av免费看 | 99久免费精品视频在线观看 | 成人18视频 | 99在线视频精品 | 天天操夜夜操天天射 | 99色网站 | 91麻豆国产 | 成人免费ⅴa | 久久精品99国产精品 | 久久免费在线观看 | 黄色三级在线看 | 亚洲乱码精品久久久 | 亚洲资源在线网 | 日韩精品视频在线免费观看 | 午夜视频在线瓜伦 | 超碰97中文 | 9999毛片| 免费观看一区二区三区视频 | 日本视频高清 | 亚洲不卡av一区二区三区 | 韩日av一区二区 | 天天操天天舔天天干 | 欧美精品久久久久久久亚洲调教 | 精品欧美一区二区在线观看 | 伊人成人久久 | 国产高清久久 | 精品一区二区在线播放 | 五月婷婷播播 | 西西444www大胆无视频 | 高清av不卡| 中文字幕乱在线伦视频中文字幕乱码在线 | 欧美精品三级 | 精品国产一区二区三区av性色 | 五月婷婷视频在线 | 日本黄色免费大片 | 干狠狠| 午夜视频在线观看一区二区 | 激情开心 | 国产精品毛片久久蜜 | 懂色av一区二区三区蜜臀 | 波多野结衣视频在线 | 日本久久不卡视频 | 亚洲第一区在线播放 | 韩国av免费观看 | 9幺看片| 久久论理 | 日本一区二区高清不卡 | 亚洲精品五月 | 久久艹艹 | 国产r级在线观看 | 欧美一级电影免费观看 | 亚洲 欧美 国产 va在线影院 | 狠狠色丁香婷婷综合久小说久 | 免费日韩一区二区三区 | 黄色在线免费观看网址 | 91亚洲精品久久久久图片蜜桃 | 最近高清中文字幕在线国语5 | 亚洲精品综合久久 | 性色av一区二区 | 超碰人人干人人 | 欧美日韩免费一区二区 | 国产一区二区精品久久 | 亚洲三级在线 | 亚洲成人av在线 | 免费观看91视频大全 | 日韩欧美国产成人 | 五月天网页 | 成年人视频免费在线 | 国产精品综合久久久久 | 激情大尺度视频 | 亚洲乱亚洲乱妇 | 亚洲精区二区三区四区麻豆 | 久久久久国产精品厨房 | 色播亚洲婷婷 | 午夜少妇av| 精品视频免费观看 | 亚洲在线视频免费观看 | 不卡中文字幕在线 | 久久国产精品二国产精品中国洋人 | 五月婷亚洲 | 久久福利精品 | 日韩精品久久一区二区 | 亚洲日韩欧美一区二区在线 | 国产在线观看xxx | 8x成人在线 | 亚洲第一区在线播放 | 亚洲精品美女免费 | 99国产视频| 色天天中文 | 久久精品中文 | 久久黄色小说视频 | 久草香蕉在线 | 日韩免费成人av | 欧美aa级| 丁香影院在线 | 国产精品你懂的在线观看 | 国产精品18videosex性欧美 | 17婷婷久久www| 麻豆精品国产传媒 | 天天干人人 | 亚洲欧美成人综合 | 亚洲,国产成人av | 欧美一区二区三区免费观看 | 免费精品久久久 | 人人看人人 | 免费网站在线观看成人 | 在线观看国产亚洲 | 超碰在线天天 | 91超级碰碰 | 免费福利视频网站 | 日韩乱色精品一区二区 | 国产成人免费网站 | 亚洲精品日韩av | 亚洲色图 校园春色 | 日日爱夜夜爱 | 国产日产欧美在线观看 | 在线a人v观看视频 | 国产破处精品 | 国产91对白在线播 | 久久99网| 亚洲国产免费看 | 国产亚洲精品久久久久久 | 日韩欧美国产免费播放 | 久99久精品视频免费观看 | 久久字幕网 | 2019中文最近的2019中文在线 | 亚洲精品xxx | 四虎永久免费 | www.亚洲在线 | 中文字幕a∨在线乱码免费看 | 精品久久久久一区二区国产 | 麻豆影视在线观看 | 日韩美av在线 | 黄色大全免费观看 | 国产99免费 | 狠狠的干狠狠的操 | 激情婷婷综合网 | 激情网综合 | 天天做天天爱夜夜爽 | 国产亚洲视频中文字幕视频 | 天天操天 | 亚洲综合色视频 | 水蜜桃亚洲一二三四在线 | www.五月婷婷.com| 中文字幕在线观看不卡 | 五月婷婷爱 | 91精品视屏 | 成人免费在线视频观看 | 日本丶国产丶欧美色综合 | 亚洲欧美日本一区二区三区 | 成人久久影院 | 国产精品毛片久久蜜 | 成人免费在线观看电影 | 亚洲精品色婷婷 | 日韩一区二区三免费高清在线观看 | 日日爽天天爽 | 久久尤物电影视频在线观看 | 国产在线小视频 | 97视频一区| 国产网红在线 | 国产高清福利在线 | 四虎在线免费观看 | 婷婷综合伊人 | 成人黄色小说在线观看 | 亚洲精品ww | 欧美日韩国产精品一区二区 | 91免费高清| 精品专区一区二区 | 国产精品久久视频 | 香蕉在线观看视频 | 在线观看视频免费播放 | av网址最新| 久久亚洲精品国产亚洲老地址 | 在线观看黄| 99久久精品久久久久久清纯 | 欧美在线日韩在线 | 免费高清男女打扑克视频 | 午夜 在线| 久久久精品| 久久国产高清视频 | 97涩涩视频 | 天天干,天天草 | 久久这里只有精品视频99 | 丁香六月国产 | 日本久久久精品视频 | 久久久久亚洲国产 | www.天天干.com | 99久久精品国产毛片 | www.午夜视频 | 成人黄色一级视频 | 最近2019年日本中文免费字幕 | 日韩欧美电影在线 | 99久久精品久久久久久动态片 | 天天射天天搞 | 成人日批视频 | 国产一级片视频 | 免费久久精品视频 | 亚洲另类xxxx | 欧美激情精品久久久久久 | 成人影片免费 | 成人精品亚洲 | 99在线视频播放 | 在线观看的黄色 | 欧美日韩中文在线视频 | 国产精品理论片在线播放 | 国产一区精品在线观看 | 国产精品久一 | 日韩免费视频网站 | 午夜美女福利 | 欧美性久久久久久 | 亚洲精品视频在线观看免费视频 | 久久五月精品 | 成 人 黄 色 视频免费播放 | 国产成人一区三区 | 国产美女久久久 | 99视频免费看 | 成人免费视频播放 | 99精品一级欧美片免费播放 | 黄色av三级在线 | 激情电影影院 | 香蕉视频在线播放 | 欧美另类视频 | www.xxx.性狂虐 | 麻豆影视在线观看 | 免费精品人在线二线三线 | 91九色在线观看视频 | 国产人成在线观看 | 亚洲精品日韩一区二区电影 | 成人a在线观看 | 国产欧美综合在线观看 | 涩涩伊人 | 中文欧美字幕免费 | 国产精品免费一区二区三区 | 99久久精品国产亚洲 | 综合久久久久久久 | 人人爽久久涩噜噜噜网站 | 午夜久久网站 | 激情动态| 99国产在线观看 | 天堂久久电影网 | 在线观看视频免费大全 | 久久久久激情视频 | 在线国产激情视频 | av网站大全免费 | 草久热| 国产精品免费在线视频 | 久久理论电影网 | 美女av免费| 一区二区三区四区五区在线 | 国产91成人在在线播放 | 狠狠成人| 五月婷影院| 日本午夜在线观看 | 91一区二区三区在线观看 | www.国产在线视频 | 四虎视频| 国产乱对白刺激视频在线观看女王 | 91精品一区二区三区蜜桃 | 国产男女爽爽爽免费视频 | 天天操天天干天天综合网 | 一区二区欧美激情 | 黄a在线看 | 亚洲女欲精品久久久久久久18 | 国产美女免费视频 | 国产日韩欧美综合在线 | av电影免费在线看 | 91高清在线 | 97精品欧美91久久久久久 | 精品国偷自产在线 | 最近日本韩国中文字幕 | 一区二区三区日韩视频在线观看 | 福利视频一二区 | 一区二区三区高清在线 | 国产三级av在线 | 在线观看成人毛片 | 欧美色图视频一区 | 日韩视频欧美视频 | 在线а√天堂中文官网 | 欧美久久久久久久久久久久久 | 成人午夜影院在线观看 | 日本中文字幕高清 | 久久精品国产精品亚洲 | 久久黄色小说 | 99在线免费视频观看 | 免费a级黄色毛片 | 日韩黄色大片在线观看 | 国产精品国内免费一区二区三区 | 美女一区网站 | 五月天久久激情 | h动漫中文字幕 | 亚洲精品视频免费看 | 天天操天天操天天 | 久久99久国产精品黄毛片入口 | 国产成人黄色 | 99色精品视频 | 亚洲色图av | 色五婷婷 | 欧美天天综合网 | 在线播放亚洲激情 | 久操操| 日韩精品中文字幕一区二区 | 国产999视频 | 欧美韩国在线 | 欧美激情精品久久久久久免费 | 国产人成在线视频 | 亚洲黄色a| 91视频大全 | 国产麻豆视频在线观看 | 女人18片 | 免费观看一区二区三区视频 | 亚洲午夜久久久影院 | 探花在线观看 | av成人动漫在线观看 | 日韩中文免费视频 | 国产精品福利在线 | 一区二区三区免费播放 | 91tv国产成人福利 | 国产视频精品视频 | 丁香综合五月 | 国产97色在线 | 久久国产视频网站 | 亚洲精品久久久久久久不卡四虎 | 精品久久久久久综合日本 | 成年人网站免费在线观看 | 五月天色婷婷丁香 | 国产精成人品免费观看 | 亚洲va综合va国产va中文 | 久草在线这里只有精品 | 99精品久久久久久久久久综合 | 91在线产啪 | 在线观看激情av | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 91福利区一区二区三区 | 国产精品久久久久永久免费 | 亚洲欧洲中文日韩久久av乱码 | 深爱婷婷网 | 中文字幕 国产精品 | 一区二区激情视频 | 久久久久久久久久久免费 | 婷婷久久久久 | 中文字幕在线网址 | 成人影片在线免费观看 | 国产精品影音先锋 | www.夜夜| 日韩黄色免费 | 国产中文字幕一区二区 | 高潮毛片无遮挡高清免费 | 最近久乱中文字幕 | 欧美一区中文字幕 | 天天艹天天干天天 | 中文字幕免费 | 丁香五婷 | 91视频 - x99av| 一区二区视频免费在线观看 | 五月天激情视频在线观看 | 亚洲精品高清视频在线观看 | 中文字幕日韩有码 | 中文资源在线播放 | 亚洲精品日韩在线观看 | 在线看av网址| 欧美激情第八页 | 国产福利免费在线观看 | 成年人网站免费观看 | 天天操天天操天天 | 日韩av手机在线看 | 91精彩在线视频 | 久久精品亚洲一区二区三区观看模式 | av电影免费在线 | 国产一区在线看 | 成人免费网视频 | 久草新在线| 国产精品久久久久久久7电影 | 探花视频免费观看高清视频 | 国产亚洲精品综合一区91 | 91爱爱网址| 久久福利 | av在线网站观看 | 久久99热这里只有精品国产 | 美女久久久久久久久久 | 亚洲综合在线五月 | 人人干人人模 | 日韩国产精品久久久久久亚洲 | 色综合天天色综合 | 天天干夜夜操视频 | 在线之家免费在线观看电影 | 99久久成人 | 国产精品黄色av | 久久超级碰视频 | 激情久久综合网 | 99久久精品免费看国产麻豆 | 四虎永久免费网站 | 精品国产一区二区三区在线观看 | 亚洲桃花综合 | 精品国产乱码久久久久久1区二区 | 97福利| 91av大全 | 日韩电影一区二区三区 | 久久国产一区二区 | 精品一区二区免费 | 色欧美成人精品a∨在线观看 | 天天综合视频在线观看 | 天堂av在线| 久久99在线 | 精品成人久久 | 日韩欧美黄色网址 | 久久人人爽爽人人爽人人片av | 国产香蕉97碰碰碰视频在线观看 | av手机版 | 色综合天天狠天天透天天伊人 | 久久久精品久久日韩一区综合 | 色爱成人网 | 正在播放久久 | 激情综合五月天 | 夜夜视频 | 欧美成人xxxxxxxx | 在线亚洲日本 | 综合在线亚洲 | 成人在线视频观看 | 国产97色 | 天天操天天干天天 | 一区二区在线电影 | 亚洲激色 | 99中文字幕 | 亚洲欧美色婷婷 | 午夜国产福利在线观看 | 国产99久久久欧美黑人 | 日日夜夜狠狠操 | 九七在线视频 | 亚洲 欧美 另类人妖 | 看毛片网站 | 天天躁日日躁狠狠躁 | 热久久99这里有精品 | 国产精品自产拍 | 麻豆视频国产精品 | 国产精品久久久久久久久软件 | 在线观看成人 | 国产一区在线免费 | 夜夜操天天 | 免费99精品国产自在在线 | 亚洲精品国精品久久99热一 | 国产在线视频不卡 | 久久第四色| 欧美精品一级视频 | 91麻豆传媒 | 9热精品 | 天天操天天操天天操天天操天天操 | 日韩免费观看一区二区三区 | 久久久久久久久久久综合 | 精品久久久国产 | 18性欧美xxxⅹ性满足 | 亚洲国产操 | 国产黄色片久久 | 日本3级在线观看 | 免费观看性生活大片3 | 中文字幕日韩av | 丁香六月婷婷开心婷婷网 | 成年人视频免费在线播放 | 国产精品一区二区三区99 | 最近2019年日本中文免费字幕 | 在线观看视频亚洲 | 黄色91在线观看 | 国产精品va在线观看入 | 99色国产| 国产精品自拍在线 | 欧美日韩一区二区三区在线免费观看 | 久久午夜鲁丝片 | 人人干在线观看 | 久草com| 丁香婷五月 | 婷婷六月综合网 | 日韩精品一区二区三区电影 | 不卡的av在线播放 | 国产免费嫩草影院 | 免费毛片aaaaaa | 亚洲婷久久 | av日韩不卡| 亚洲第一av在线播放 | 亚洲精品视频二区 | 亚洲国产欧美在线人成大黄瓜 | 黄免费网站 | 久久影院中文字幕 | 亚洲一区美女视频在线观看免费 | 久久久久久99精品 | 国产专区一 | 日日夜夜精品免费视频 | 91大片网站 | 四虎国产精品成人免费影视 | 久久综合婷婷国产二区高清 | 欧美三级高清 | 懂色av一区二区在线播放 | 特级毛片aaa | 成人全视频免费观看在线看 | 91手机电视| 99精品视频在线观看播放 | 国产精品一区二区av麻豆 | 一本一本久久a久久 | 久久99深爱久久99精品 | 日韩免费在线一区 | 亚洲成a人片在线www | 天天射天天干天天插 | 久久久久福利视频 | 中文字幕在线久一本久 | 婷婷色综| 在线日韩中文 | 欧美激情视频一二三区 | 国产精华国产精品 | 九热在线 | 国产精品第一页在线 | 中文一区二区三区在线观看 | 免费观看全黄做爰大片国产 | 在线视频欧美亚洲 | 亚洲欧洲国产视频 | 日日摸日日 | 97香蕉久久超级碰碰高清版 | 日韩精品中文字幕有码 | 中文字幕欧美日韩va免费视频 | 国产精品成人免费精品自在线观看 | 91av视屏| 免费观看国产精品 | 婷婷色网站| 亚洲国产日韩欧美在线 | 91精品入口 | 麻豆精品视频在线观看免费 | 久久精品综合一区 | 国产精品99久久久久久久久久久久 | 99精品免费视频 | 国产成人精品亚洲日本在线观看 | 国产传媒中文字幕 | 成人app在线播放 | 丁香六月久久综合狠狠色 | 在线播放亚洲激情 | 亚洲激情电影在线 | 欧美日韩精品影院 | www.91av在线| 国产黄色一级大片 | 黄在线 | 丁香激情婷婷 | 一区二区三区四区不卡 | 在线观看精品黄av片免费 | 久艹在线免费观看 | 91在线超碰| 91c网站色版视频 | 在线观看视频你懂得 | 毛片网站观看 | 粉嫩一区二区三区粉嫩91 | 欧美另类交人妖 | 亚洲精品人人 | 中文字幕在线播放日韩 | 中文字幕久久精品亚洲乱码 | 人成电影网| 亚洲精品tv久久久久久久久久 | 日韩中文字幕免费看 | 成人国产一区二区 | 婷婷婷国产在线视频 | 免费成人看片 | 免费观看的黄色 | 欧美老少交 | 一二区av | 五月天综合婷婷 | 日韩在线观看中文 | 超碰大片| 999久久久精品视频 日韩高清www | 日韩精品高清不卡 | 日韩羞羞| 国产成人精品一区二区三区在线 | 免费日韩av电影 | 久草精品在线 | 婷婷丁香九月 | 超碰在线观看av.com | 麻豆91在线播放 | 操操操人人 | 视频国产| 最新国产中文字幕 | 成人夜晚看av | 97超碰人人| 成 人 免费 黄 色 视频 | 色视频网站免费观看 | 精品国产诱惑 | 免费观看十分钟 | 国产一区麻豆 | 国产精品原创av片国产免费 | 久久只精品99品免费久23小说 | 精品国产精品一区二区夜夜嗨 | 欧美精品国产综合久久 | 国产成人久 | 成人a视频片观看免费 | 曰本三级在线 | 亚洲一区二区三区毛片 | 久久精品99久久久久久 | 爱情影院aqdy鲁丝片二区 | 成人黄色电影在线播放 | 免费成人在线网站 | 国产精品久久久久国产精品日日 | 国产精品亚洲人在线观看 | 欧美色操 | 91丨精品丨蝌蚪丨白丝jk | 五月激情姐姐 | 中文字幕一区二区三区四区在线视频 | 国产精品久久久久久久久久 | 国产成人精品一区二区在线 | zzijzzij亚洲日本少妇熟睡 | 99九九热只有国产精品 | 久久人视频 | 国产一区二三区好的 | 国产91精品一区二区麻豆网站 | 久久精品99国产精品亚洲最刺激 | 亚洲免费成人 | 精品国产诱惑 | 国产91大片 | 亚洲视频精选 | 日本婷婷色 | 亚洲精选视频免费看 | 99热这里只有精品在线观看 | 免费观看成人网 | 99久久夜色精品国产亚洲 | 一区二区三区免费在线观看 | 日韩欧美一区二区三区在线 | av性在线| 成人免费中文字幕 |