2013年1月25日星期五
折腾三天了,终于解决了centos firefox flash 不能播放的问题。
插件正常安装,就是显示个黑屏,琢磨了半天,估计是因为没有安装curl 的问题,
解决:
yum install curl compat-libstdc++-33 glibc nspluginwrapper
重启firefox ,ok 。给大家做个参考
LINUX mozilla firefox 网页视频无法播放的解决
这个问题困扰了我很久,相信对ubuntu的初学者大都会遇到这个问题,再次给大家分享下我的方法:
1.首先,确保你已经把显示的“安装缺失插件”安装好,这时,比如说,打开
http://v.hoopchina.com/v237459.html这个视频网址,点击后会出现弹窗,但不能播放。
2.然后根据火狐浏览器所提供的网址,我下载到“install_flash_player_10_linux.tar.gz”文件。
在下面的tar命令中,使用选项“z”是因为该文件的后缀为“.gz”,这表示此文件是用gzip来压缩的,所以在还原时,一定要有该选项才能进行解压缩;选项“x”表示从档案文件中释放文件;选项“v”表示详细报告tar处理的文件信息;选项“f”表示使用档案文件或设备,此选项通常为必选。
# tar zxvf install_flash_player_10_linux.tar.gz
libflashplayer.so
libflashplayer.so
只有一个“.so”文件,很明显,就是要将得到的这个文件移至火狐的插件目录下。可是,问题来了──火狐的插件目录在哪?一听到火狐浏览器,很容易想到mozilla。没错,找到这个就好办了。可是,要到哪去找呢?在Linux系统中,一些主要的应用程序一般都会保存在/usr目录下。
3.查找火狐浏览器的插件目录
[root@C DownLoad]# find /usr -name mozilla
/usr/lib/mozilla
/usr/share/mozilla
有两个,是哪一个呢?还是先看下这两个文件夹里的内容。
# ls /usr/lib/mozilla
extensions plugins
# ls /usr/share/mozilla
extensions
很明显,plugins就是插件目录啦。
4.把解压出来的“libflashplayer.so”文件剪切至/usr/lib/mozilla/plugins目录下
# mv libflashplayer.so /usr/lib/mozilla/plugins/
3.查找火狐浏览器的插件目录
[root@C DownLoad]# find /usr -name mozilla
/usr/lib/mozilla
/usr/share/mozilla
有两个,是哪一个呢?还是先看下这两个文件夹里的内容。
# ls /usr/lib/mozilla
extensions plugins
# ls /usr/share/mozilla
extensions
很明显,plugins就是插件目录啦。
4.把解压出来的“libflashplayer.so”文件剪切至/usr/lib/mozilla/plugins目录下
# mv libflashplayer.so /usr/lib/mozilla/plugins/
注意,若显示权限不够,则应在语句前加 sudo
到这里似乎就可以了,别急,先看下“libflashplayer.so”这个文件的权限。没办法,到了Linux的环境下,权限问题应该摆在第一位。
# ls -l /usr/lib/mozilla/plugins/libflashplayer.so
-rwxr-xr-x 1 1000 1000 10278616 07-18 11:10 /usr/lib/mozilla/plugins/libflashplayer.so
表明这个文件的所有者、所属组都是1000。先不管有没有这个用户、这个组,我现在使用的是root用户、root组,当然要改过来。
# chown root /usr/lib/mozilla/plugins/libflashplayer.so
# chgrp root /usr/lib/mozilla/plugins/libflashplayer.so
5)重新启动火狐浏览器(此后步骤因PC而异~~)
问题依然存在,怎么回事?我在根目录下搜了一下“*flashplayer*”
# find -name "*flashplayer*" #这个地方显示为*和“号,是用英文来书写。
/usr/lib/flash-plugin/flashplayer.xpt
/usr/lib/flash-plugin/libflashplayer.so
/usr/lib/mozilla/plugins/libflashplayer.so
/root/.macromedia/Flash_Player/macromedia.com/support/flashplayer
在/usr/lib/mozilla/plugins/目录下的“libflashplayer.so”文件是我从网站上下载并拷贝进去的,可是/usr /lib/flash-plugin目录下居然也有一个“libflashplayer.so”文件,而/usr/lib/flash-plugin目录本身很明显就是flash插件的一个目录,先看下里面的东西再说。
# ls /usr/lib/flash-plugin/
flashplayer.xpt libflashplayer.so setup
homecleanup LICENSE show-license
唯一闪光的也就是“flashplayer.xpt”这个文件了,没得选了,把这个文件也拷贝到火狐的插件目录下吧。
[root@C DownLoad]# cp /usr/lib/flash-plugin/flashplayer.xpt /usr/lib/mozilla/plugins/
还是不行?崩溃,崩溃!也许系统本身不支持最新版本的“libflashplayer.so”文件,那我就从/usr/lib/flash-plugin目录下把系统自带的拷过来,这总行了吧?
# cp /usr/lib/flash-plugin/libflashplayer.so /usr/lib/mozilla/plugins/
重启,终于没问题了。
总结一下,其实最新的未必实用。先看下自己机子上有没有“libflashplayer.so”这个文件,有的话就直接拷贝到浏览器的插件目录下,就这么简单。
# ls -l /usr/lib/mozilla/plugins/libflashplayer.so
-rwxr-xr-x 1 1000 1000 10278616 07-18 11:10 /usr/lib/mozilla/plugins/libflashplayer.so
表明这个文件的所有者、所属组都是1000。先不管有没有这个用户、这个组,我现在使用的是root用户、root组,当然要改过来。
# chown root /usr/lib/mozilla/plugins/libflashplayer.so
# chgrp root /usr/lib/mozilla/plugins/libflashplayer.so
5)重新启动火狐浏览器(此后步骤因PC而异~~)
问题依然存在,怎么回事?我在根目录下搜了一下“*flashplayer*”
# find -name "*flashplayer*" #这个地方显示为*和“号,是用英文来书写。
/usr/lib/flash-plugin/flashplayer.xpt
/usr/lib/flash-plugin/libflashplayer.so
/usr/lib/mozilla/plugins/libflashplayer.so
/root/.macromedia/Flash_Player/macromedia.com/support/flashplayer
在/usr/lib/mozilla/plugins/目录下的“libflashplayer.so”文件是我从网站上下载并拷贝进去的,可是/usr /lib/flash-plugin目录下居然也有一个“libflashplayer.so”文件,而/usr/lib/flash-plugin目录本身很明显就是flash插件的一个目录,先看下里面的东西再说。
# ls /usr/lib/flash-plugin/
flashplayer.xpt libflashplayer.so setup
homecleanup LICENSE show-license
唯一闪光的也就是“flashplayer.xpt”这个文件了,没得选了,把这个文件也拷贝到火狐的插件目录下吧。
[root@C DownLoad]# cp /usr/lib/flash-plugin/flashplayer.xpt /usr/lib/mozilla/plugins/
还是不行?崩溃,崩溃!也许系统本身不支持最新版本的“libflashplayer.so”文件,那我就从/usr/lib/flash-plugin目录下把系统自带的拷过来,这总行了吧?
# cp /usr/lib/flash-plugin/libflashplayer.so /usr/lib/mozilla/plugins/
重启,终于没问题了。
总结一下,其实最新的未必实用。先看下自己机子上有没有“libflashplayer.so”这个文件,有的话就直接拷贝到浏览器的插件目录下,就这么简单。
另外,注意 :在第3步,查找火狐浏览器的插件目录时,注意有plugins的目录,一定要把libflashplayer.so 文件添加到每一个含有plugins的目录下!!!
兴趣是成功之母,相信自己,走自己的路,加油!
你的企业需要二维码吗?扫描二维码就直接跳转到你的网站?是如何做到的
你的企业需要二维码吗?扫描二维码就直接跳转到你的网站?是如何做到的
发表于:2013年01月05日 19:070
然后可以选择自己喜欢的图,鼠标移动到图案中间,出现点击生成,然后点鼠标左键。就可以生成了。
然后弹出来对话框,点击下载保存就可以了。以后把这个二维码发出去。印在名片上,或网站上。让朋友去扫描一下。看看是不是直接能进入你的网站。(有个问题。如果下载保存,下载不下来的话。可以在图片上按鼠标右键.然后点击图片另存为,就可以保存了)
简单我就分享到这,其实这个网站有很多功能,朋友们自己去测试吧。
本文由 大蓝海软文联盟 软文范例 独家发表,欢迎转载!
0℃linux vagex挂机赚钱一键安装包 for debian
前几天发了一个Vagex在Centos上的一键安装包,很多用Debian的系统装不上,今天看到了一个,顺便更新了下。
该一键包包含的有
- Firefox
- flash 插件
- VNC
- vagex 插件
安装步骤
1、先进入 screen ,防止中途断线。
- screen
2、下载 vagex_debian.sh
- wget http://vagex-debian.googlecode.com/svn/trunk/vagex_debian.sh
3、执行 vagex_debian.sh
- sh vagex_debian.sh
4、中途需要输入 VNC 的密码
- -----------
- Plese input the VNC password below!
- -----------
- You will require a password to access your desktops.
- Password:
- Verify:
5、看到以下提示即完成安装
- Starting VNC server...DONE!
- -----------
- Now you can VNC to complete the rest of the installation manually!
- -----------
6、VNC 登陆,浏览器已经打开,进行必要的浏览器优化。
7、依次选择 File > Open File ,选择 vagex 安装文件,默认在 /tmp 下,确定安装,重启浏览器。
8、第一次重启后无法输入 vagex ID ,点击 cancel ,转向终端执行以下命令重启后 VNC 登陆,正常输入 vagex ID 。
- /etc/init.d/vncserverd restart
9、按 ctrl + w 关掉小窗口,确认挂机正常后按 ctrl + q 正常退出浏览器,转向终端再次执行以下命令重启。
- /etc/init.d/vncserverd restart
浏览器优化
View > Toolbars > 去勾 Bookmarks ToolbarEdit > Preferences > General > When Namoroka starts: Show a blank pageView > Preferences > Privacy > Namoroka will: Never remember historyView > Preferences > Advanced > Update > 全部去勾地址栏输入 about:config 回车并确认,在 Filter 输入 libflashplayer 搜索,双击结果使之 Value 为 false 。
再说明下,该一键包是在Debian下工作的,如果是Centos的话请看另一篇文章
Linux Vagex一键包 for centos-全自动挂Vagex赚美刀
Linux Vagex一键包 for centos 5.x(特别注意版本)-全自动挂Vagex赚美刀
Vagex是一个刷Youtube视频浏览量的平台,类似于国内以前的淘宝刷信誉。Vagex与Youtube合作,在Youtube视频浏览量达到一定访问量,就会得到谷歌给予的广告分成。用户在Vagex平台提交Youtube的视频播放地址,我们挂机的软件或者浏览器插件会自动进行播放,我们获取的播放点数用来兑换美元,而需要刷浏览量的用户支付美元来购买点数,这是我们的资金获取来源。有空闲VPS的V友们,赶紧把这资源好好利用起来,也许还可以给你省下一大笔VPS费用.
最基本要求:
(1)需要注册一个Vagex帐号 ====【猛击这里】
(2)需要有一台空闲的美国VPS,Winows或者Linux均可
Windows系统需要系统安装.NET 2.0和IE9,下载以后解压,执行,输入Vagex用户中心的ID(Your User Account ID: #XXXXX,只需要输入数字)即可。
Linux VPS安装Vagex教程【Linux系统需要至少独享256M,突发512M的机器才可以,Firefox和Flash插件都要占用不少内存】。
1、下载一键包【CentOS 5系列版本】
32位系统:wget http://www.imnpc.me/AutoxfceCentOS32x.sh64位系统:wget http://www.imnpc.me/AutoxfceCentOS64x.sh
2、安装脚本
32位系统执行:sh ./AutoxfceCentOS32x.sh64位系统执行:sh ./AutoxfceCentOS64x.sh
3、安装过程请设置VNC密码【必须设置,当看到以下信息,请输入您要设置的VNC密码,需要输入2次】
password:
4、安装完毕后重启,下载安装VNCviewer管理
然后输入你VPS的IP:1进行连接,例如您的IP:184.82.88.88,就需要输入184.82.88.88:1,链接以后输入密码即可看到桌面
5、firefox设置
打开firefox,就是点桌面下方那个地球一样的图标,启动之后,再打开资源管理器就是地球左手边的那个图标。
然后拖动vagex(vagex_firefox_add_on-1.4.1-fx.xpi)插件到firefox界面,
然后拖动vagex(vagex_firefox_add_on-1.4.1-fx.xpi)插件到firefox界面,
就会自动安装插件了,安装完后重启一下火狐,
会弹出一个对话框要你输入你的ID,输入ID之后vagex就开始工作了!
会弹出一个对话框要你输入你的ID,输入ID之后vagex就开始工作了!
接下来要对火狐做一个设置,就是不保存历史记录,其中原因我就不介绍了,但是这个一定要设置!
Edit——Preferences——Privacy
在firefox will后面的框里选Never remember history
这样火狐就设置好了,接着把firefox设置成开机启动
单击桌面下面最左边的那个X一样的图标选settings——Autostarted applications
6、增加计划任务(每6个小时自动重启,避免firefox长时间运行卡死)
- crontab -e
按下字母 i 进入编辑模式,copy以下代码
- 00 00 * * * rm -rf /root/.vnc/*.log
- 01 00 * * * reboot
- 00 06 * * * rm -rf /root/.vnc/*.log
- 01 06 * * * reboot
- 00 12 * * * rm -rf /root/.vnc/*.log
- 01 12 * * * reboot
- 00 18 * * * rm -rf /root/.vnc/*.log
- 01 18 * * * reboot
然后按下esc,然后Shift+:,输入 wq ,就会保存退出.
在弹出的对话框中点击Add,在name中输入firefox,Description不用输入,Command中输入firefox
如此firefox的开机启动也设置好了!
接下来reboot一下看看是否能正常工作!
Android NFC 开发实例
作者:裘德超
使用硬件:Google Nexus S,北京大学学生卡。(ps:笔者本想使用公交一卡通进行测试,发现手机不能正确识别)
手机操作系统:Android ICS 4.04。
开发时,笔者从Google Play Store上下载了NFC TagInfo软件进行对比学习。所以我们可以使用任意一张能被TagInfo软件正确识别的卡做测试。
在Android NFC 应用中,Android手机通常是作为通信中的发起者,也就是作为各种NFC卡的读写器。Android对NFC的支持主要在 android.nfc 和android.nfc.tech 两个包中。
android.nfc 包中主要类如下:
NfcManager 可以用来管理Android设备中指出的所有NFCAdapter,但由于大部分Android设备只支持一个NFC Adapter,所以一般直接调用getDefaultAapater来获取手机中的Adapter。
NfcAdapter 相当于一个NFC适配器,类似于电脑装了网络适配器才能上网,手机装了NfcAdapter才能发起NFC通信。
NDEF: NFC Data Exchange Format,即NFC数据交换格式。
NdefMessage 和NdefRecord NDEF 为NFC forum 定义的数据格式。
Tag 代表一个被动式Tag对象,可以代表一个标签,卡片等。当Android设备检测到一个Tag时,会创建一个Tag对象,将其放在Intent对象,然后发送到相应的Activity。
android.nfc.tech 中则定义了可以对Tag进行的读写操作的类,这些类按照其使用的技术类型可以分成不同的类如:NfcA, NfcB, NfcF,以及MifareClassic 等。其中MifareClassic比较常见。
在本次实例中,笔者使用北京大学学生卡进行数据读取测试,学生卡的TAG类型为MifareClassic。
AndroidManifest.xml:
- <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>
<?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>
res/xml/nfc_tech_filter.xml:
<resourcesxmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.MifareClassic</tech>
</tech-list>
</resources>
<uses-permissionandroid:name="android.permission.NFC"/>
<uses-featureandroid:name="android.hardware.nfc"android:required="true"/>
表示会使用到硬件的NFC功能。并且当用户在Google Play Store中搜索时,只有带有NFC功能的手机才能够搜索到本应用。
当手机开启了NFC,并且检测到一个TAG后,TAG分发系统会自动创建一个封装了NFC TAG信息的intent。如果多于一个应用程序能够处理这个intent的话,那么手机就会弹出一个框,让用户选择处理该TAG的Activity。TAG分发系统定义了3中intent。按优先级从高到低排列为:
NDEF_DISCOVERED, TECH_DISCOVERED, TAG_DISCOVERED
当Android设备检测到有NFC Tag靠近时,会根据Action申明的顺序给对应的Activity 发送含NFC消息的 Intent。
此处我们使用的intent-filter的Action类型为TECH_DISCOVERED从而可以处理所有类型为ACTION_TECH_DISCOVERED并且使用的技术为nfc_tech_filter.xml文件中定义的类型的TAG。
详情可查看http://developer.android.com/guide/topics/nfc/nfc.html说明。下图为当手机检测到一个TAG时,启用Activity的匹配过程。
res/layout/main.xml
- <?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>
定义了Activity的布局:只有一个带有滚动条的TextView用于显示从TAG中读取的信息。
res/values/strings.xml
- <?xml version="1.0" encoding="utf-8"?>
- <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
- 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();
- }
- }
- }
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(); } } }
关于MifareClassic卡的背景介绍:数据分为16个区(Sector) ,每个区有4个块(Block) ,每个块可以存放16字节的数据。
每个区最后一个块称为Trailer ,主要用来存放读写该区Block数据的Key ,可以有A,B两个Key,每个Key 长度为6个字节,缺省的Key值一般为全FF或是0. 由 MifareClassic.KEY_DEFAULT 定义。
因此读写Mifare Tag 首先需要有正确的Key值(起到保护的作用),如果鉴权成功
然后才可以读写该区数据。
执行效果:
参考联接:
http://developer.android.com/guide/topics/nfc/nfc.html
http://developer.android.com/reference/android/nfc/tech/MifareClassic.html
http://www.imobilebbs.com/wordpress/?p=2822
订阅:
博文 (Atom)