当前位置:  编程技术>移动开发
本页文章导读:
    ▪Apk反编译助理        Apk反编译助手 Android是一个让人很纠结的产品,它开源开放,但是也有很多蛋疼坑爹的地方,还是那句话,谁开发谁知道!Apk反编译助手,懒人和对command line无爱的同学们可下载看看,至.........
    ▪ NFC相干研究        NFC相关研究 NFC概述 NFC是短距离的无线通信,通常距离是4厘米或更短。 NFC工作频率是13.56M Hz,传输速率是106kbit/s到 848kbit/s。 NFC总是在一个发起者和一个被动目标之间发生。发起者发出.........
    ▪ WP中的领航服务及不同页面间的参数传递方法       WP中的导航服务及不同页面间的参数传递方法 在Android应用中,我们使用Intent在不同页面之间进行导航,那么在Windows Mobile中,其对应物是什么呢?答案就是: NavigationService 关于其类型定义及.........

[1]Apk反编译助理
    来源: 互联网  发布时间: 2014-02-18
Apk反编译助手
Android是一个让人很纠结的产品,它开源开放,但是也有很多蛋疼坑爹的地方,还是那句话,谁开发谁知道!

Apk反编译助手,懒人和对command line无爱的同学们可下载看看,至少需要.net 2.0和jdk 1.6。
核心是apktool,dex2jar,jd-gui,只是包了层皮。具体请访问以下地址。


apktool : http://code.google.com/p/android-apktool/

dex2jar : http://code.google.com/p/dex2jar/

jd-gui : http://java.decompiler.free.fr/?q=jdgui





    
[2] NFC相干研究
    来源: 互联网  发布时间: 2014-02-18
NFC相关研究

NFC概述
  • NFC是短距离的无线通信,通常距离是4厘米或更短。
  • NFC工作频率是13.56M Hz,传输速率是106kbit/s到 848kbit/s。
  • NFC总是在一个发起者和一个被动目标之间发生。发起者发出近场无线电波,这个近场可以给被动目标供电。这些被动的目标包括不需要电源的标签,卡,也可以是有电源的设备。

相比其他无线通信技术,如蓝牙和WiFi,NFC带宽更低,通信距离更短,低成本,不需要供电,不需要实现匹配,整个通信过程仅仅是短短的靠近一秒就能完成。

一个带有NFC支持的android设备通常是一个发起者。也可以作为NFC的读写设备。他将检测 NFC tags并且打开一个Activity来处理。Android 2.3.3还有支持有限的P2P(点对点传输) 。

Tag分很多种,其中简单的只提供读写段,有的只能读。复杂的tag可以支持一些运算,加密来控制对tag里数据段的读写。甚至一些tag上有简单的操作系统,允许一些复杂的交互和可以执行一些代码。

更多信息参见NFC资料收集

Android API概览 Android.nfc包

包含顶层类用来与本地NFC适配器交互。这些类可以表示被检测到的tag和NDEF数据。

类 说明 NfcManager NFC适配器的管理器,可以列出所有此Android设备支持的NFC适配器。不过大部分Android设备只有一个NFC适配器,所以大部分情况下可以直接用静态方法getDefaultAdapter(context)来取适配器。 NfcAdapter 表示本设备的NFC适配器,可以定义Intent请求将系统检测到tag的消息发送到Activity,并提供方法注册前台tag消息发布和前台NDEF推送。前台NDEF推送是目前Android版本唯一支持的p2p NFC通信方式。 NdefMessage
NdefRecord NDEF是NFC论坛定义的数据结构,用来有效的存数据到NFC tag。如文本,URL,和其他MIME类型。NdefMessage扮演一个容器,这个容器存那些发送和读到的数据。一个NdefMessage对象包 含0或多个NdefRecord,每个NdefRecord有一个类型,如文本,URL,智能海报/广告,或其他MIME数据。在NdefMessage 里的第一个NfcRecord的类型用来发送tag到一个Android设备上的activity。 Tag 标示一个被动的NFC目标,比如tag,card,钥匙挂 扣,甚至是一个电话模拟的的NFC卡。当一个tag被检测到,tag对象将被创建并且封装到一个Intent里,然后NFC发布系统会将这个Intent 用startActivity发送到注册了接受这种Intent的activity里。可以用getTechList()方法来得到这个tag支持的技术 细节和创建一个android.nfc.tech提供的相应的TagTechnology对象。
android.nfc.tech包

包含那些对tag查询属性和进行I/O操作的类。这些类分别标示一个tag支持的不同的NFC技术标准。

类 说明 TagTechnology 这个接口是下面所有tag technology类必须实现的。 NfcA 支持ISO 14443-3A Nfc-A标准的属性和操作 NfcB 支持ISO 14443-3A Nfc-B标准的属性和操作 NfcF 支持JIS 6319-4 Nfc-F的属性和操作 NfcV 支持ISO 15693 NFC-V标准的属性和操作 IsoDep 支持ISO-DEP(ISO 14443-4)标准的属性和操作 Ndef 提供NDEF格式的tag数据的访问和其他操作。 NdefFormatable 对可以被格式化成NDEF格式的tag提供一个格式化的操作 MifareClassic 如果Android设备支持MIFARE,提供对MIFARE Classic目标的属性和I/O操作。 MifareUltralight 如果android设备支持MIFARE,提供对MIFARE Ultralight目标的属性和I/O操作。
权限声明

在AndroidManifest.xml中:

  • NFC使用 <uses-permission> 元素来访问NFC硬件:
    <uses-permission android:name="android.permission.NFC" />
  • 最小SDK版本需要设置正确:
    <uses-sdk android:minSdkVersion="10"/>
    • API level 9只包含有限的tag支持,包括:
      • 通过ACTION_TAG_DISCOVERED来发布Tag信息
      • 只有通过EXTRA_NDEF_MESSAGES扩展来访问NDEF消息
      • 其他的tag属性和I/O操作都不支持
    • API level 10可以实现对tag的广泛的读写支持。
  • uses-feature元素定义:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
  • intent-filter设置

    NFC intent filter告诉Android系统该Activity能处理NFC数据,可以定义1个或多个intent filter:

    <intent-filter>
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
      <data android:mimeType="mime/type" />
    </intent-filter>
     
    <intent-filter>
      <action android:name="android.nfc.action.TECH_DISCOVERED"/>
      <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
                 android:resource="@xml/nfc_tech_filter.xml" />
    </intent-filter>
     
    <intent-filter>
      <action android:name="android.nfc.action.TAG_DISCOVERED"/>
    </intent-filter>

    上边3个intent filters有优先级,更多信息可以看下面的Tag发布系统。

    Tag发布系统

    当Android设备扫描到一个NFC tag,一般的行为是自动找出会处理这个tag Intent的最合适的Activity,而不需要用户来选择用哪个Activity来处理。因为设备扫描NFC tag的范围和时间都很短,如果让用户选择,就有可能需要移动设备,这样将会打断这个扫描过程。应该开发只处理需要处理的tags的Activity,防 止出现让用户选择使用哪个Activity来处理的情况。

    Android提供两个系统来正确的识别一个NFC tag是否是Activity想要处理的:

  • Intent发布系统
  • 前台发布系统。
  • Intent发布系统

    Intent发布系统检查所有Activity的intent filters,找出那些定义了可以处理此tag的Activity,如果有多个Activity都配置了处理同一个tag Intent,那么将使用Activity选择器来让用户选择使用哪个Activity。用户选择之后,将使用选择的Activity来处理此 Intent.

    前台发布系统

    前台发布系统允许一个Activity覆盖掉Intent发布系统而首先处理此tag Intent,要求将要处理Tag Intent的Activity运行在前台,当一个NFC tag被扫描到时,系统会先检测前台的Activity是否支持处理此Intent,如果支持,即将此Intent传给此Activity,如果不支持, 则转到Intent发布系统。

    使用Intent发布系统

    Intent发布系统指定的3个intent有不同的优先级。通常当一个tag被检测到之后,Intent就被启动(start)了,这个启动遵循以下行为:

    • android.nfc.action.NDEF_DISCOVERED:
      这个intent在一个包含NDEF负载的tag被检测到时启动,这是最高优先级的intent, Android系统不会让一个Intent能处理所有的NFC数据类型,必须在AndroidManifest.xml中指定与NFC tag对应的<data>元素,这样当扫描到的tag传过来的数据类型与定义的相匹配时,Activity就会被调用。例如想处理一个包含 plain text的NDEF_DISCOVERED intent ,要按照如下定义AndroidManifest.xml:
      <intent-filter>
          <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
          <data android:mimeType="text/plain" />
      </intent-filter>

      如果NDEF_DISCOVERED intent已经被启动,TECH_DISCOVERED和TAG_DISCOVERED intent将不会被启动。假如一个未知的tag或者不包含NDEF负载的tag被检测到,此Intent不会被启动。

    • android.nfc.action.TECH_DISCOVERED: 
      如果NDEF_DISCOVERED intent没启动或者没有一个Activity的filter检测NDEF_DISCOVERED ,并且此tag是已知的,那么此TECH_DISCOVERED Intent将会启动。TECH_DISCOVERED intent要求在一个资源文件里(xml)指定支持技术列表。
    • android.nfc.action.TAG_DISCOVERED:
      如果没有Activity处理 NDEF_DISCOVERED和TECH_DISCOVERED intents或者tag被检测为未知的,那么此Intent将会被启动。
    指定可处理的类型

    假如Activity在AndroidManifest.xml文件里声明了处理android.nfc.action.TECH_DISCOVERED intent ,则必须创建一个Xml格式的资源文件,并加上Activity支持的技术到tech-list集合里。这样Activity将被认作能处理这些 tech-list的处理者,如果tag使用的技术在定义的列表里,Activity将接收此Intent。可以用getTechList()来获得 tag支持的技术。

    例如:如果一个tag被检测到支持MifareClassic, NdefFormatable, 和 NfcA,tech-list集合必须指定了其中的一项或者多项来告诉系统该Activity能处理此Intent。

    下面是一个资源文件例子,定义了所有的技术。可以根据需要删掉不需要的项,将此文件以任意名字+.xml保存到<project-root>/res/xml文件夹。

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech-list>
            <tech>android.nfc.tech.IsoDep</tech>
            <tech>android.nfc.tech.NfcA</tech>        
            <tech>android.nfc.tech.NfcB</tech>
            <tech>android.nfc.tech.NfcF</tech>
            <tech>android.nfc.tech.NfcV</tech>
            <tech>android.nfc.tech.Ndef</tech>
            <tech>android.nfc.tech.NdefFormatable</tech>
            <tech>android.nfc.tech.MifareClassic</tech>
            <tech>android.nfc.tech.MifareUltralight</tech>
        </tech-list>
    </resources>

    也可以指定多个tech-list集合,每个集合都认做独立的。如果任何单个tech-list集合是getTechList()返回的技术集合的子集, 那么该Activity将被认为匹配了。系统还提供“与”和“或”操作。下面的例子表示支持NfcA和NDef的卡,或者支持NfcB和NDef的卡:

    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech-list>
            <tech>android.nfc.tech.NfcA</tech>        
            <tech>android.nfc.tech.Ndef</tech>
        </tech-list>
    </resources>
     
    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech-list>
            <tech>android.nfc.tech.NfcB</tech>        
            <tech>android.nfc.tech.Ndef</tech>
        </tech-list>
    </resources>
    使用前台发布系统

    前台发布系统允许一个Activity拦截tag Intent 获得最高优先级的处理,这种方式可以用下面的方法实现:

  • 添加下列代码到Activity的onCreate() 方法里
  • 创建一个PendingIntent对象, 这样Android系统就能在一个tag被检测到时定位到这个对象。
    PendingIntent pendingIntent = 
        PendingIntent
            .getActivity(this, 0, new Intent(this,getClass())
            .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
  • 在Intent filters里声明想要处理的Intent,一个tag被检测到时先检查前台发布系统,如果前台Activity符合Intent filter的要求,那么前台的Activity的将处理此Intent。如果不符合,前台发布系统将Intent转到Intent发布系统。如果指定了 null的Intent filters,当任意tag被检测到时,将收到TAG_DISCOVERED intent。因此请注意应该只处理想要的Intent。
    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("*/*");
    }catch(MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }
    intentFiltersArray = new IntentFilter[]{ndef,};
  • 设置程序要处理的Tag 技术的列表,调用Object.class.getName() 方法来获得想要支持处理的技术类。
    techListsArray = new String[][]{new String[]{NfcF.class.getName()}};
  • 覆盖onPause()和onResume()方法来打开或关闭前台发布系统。必须在主线程里调用 enableForegroundDispatch(Activity, PendingIntent, IntentFilter[], String[][]), 而且Activity需在前台(可以在onResume()里调用来保证这点)。还要覆盖onNewIntent回调来处理得到的NFC tag数据。
    public void onPause() {
        super.onPause();
        mAdapter.disableForegroundDispatch(this);
    }  
     
    public void onResume() {
        super.onResume();
        mAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
    }
     
    public void onNewIntent(Intent intent) {
        Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        //do something with tagFromIntent
    }
  • 使用NFC tag上的数据

    NFC tag上的数据以字节存放,可以将其转换成其他想要的格式。当往tag写东西时,必须以字节格式来写。Android提供API来写符合NDEF标准的信息,使用此标准能保证数据在往tag写时能被所有Android NFC设备支持。

    很多tag使用他们自己的标准来存储数据,这些标准也被Android支持。但必须自己实现协议栈来读写这些tag。可以在android.nfc.tech里找到所有支持的技术,并且可以在TagTechnology接口里对该技术有个简单了解。

    为了方便使用NDEF消息,Android用NdefRecord和NdefMessage包装原始字节数据为NDEF消息。一个NdefMessage 是保存0个或多个NdefRecords的容器,每个NdefRecord有自己的唯一类型名字格式,记录类型和ID来与其他记录区分开。可以存储不同类 型,不同的长度的记录到同一个NdefMessage。NFC tag容量的限制决定NdefMessage的大小。

    支持Ndef和NdefFormatable技术的tag可以返回和接受NdefMessage对象为参数来进行读写操作。需要创建自己的逻辑来为其他在android.nfc.tech的tag技术实现读写字节的操作。

    读NFC tag

    当NFC tag靠近NFC设备时,相应的Intent将在设备上被创建。然后通知合适的程序来处理此Intent。下面的方法可以处理TAG_DISCOVERED intent并且使用迭代器来获得包含在NDEF tag负载中的数据。

    NdefMessage[] getNdefMessages(Intent intent) {
        // Parse the intent
        NdefMessage[] msgs = null;
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
            Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
            if (rawMsgs != null) {
                msgs = new NdefMessage[rawMsgs.length];
                for (int i = 0; i < rawMsgs.length; i++) {
                    msgs[i] = (NdefMessage) rawMsgs[i];
                }
            }
            else {
            // Unknown tag type
                byte[] empty = new byte[] {};
                NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
                NdefMessage msg = new NdefMessage(new NdefRecord[] {record});
                msgs = new NdefMessage[] {msg};
            }
        }        
        else {
            Log.e(TAG, "Unknown intent " + intent);
            finish();
        }
        return msgs;
    }

    注意NFC设备读到的数据是byte类型,所以可能需要将他转成其他格式来呈现给用户。NFCDemo例子展示了怎样用com.example.android.nfc.record中的类来解析NDEF消息,比如纯文本和智能海报。

    写NFC tag

    往NFC tag写东西涉及到构造一个NDEF消息和使用与tag匹配的Tag技术。下面的代码展示怎样写一个简单的文本到NdefFormatable tag:

    NdefFormatable tag = NdefFormatable.get(t);
    Locale locale = Locale.US;
    final byte[] langBytes = locale.getLanguage().getBytes(Charsets.US_ASCII);
    String text = "Tag, you're it!";
    final byte[] textBytes = text.getBytes(Charsets.UTF_8);
    final int utfBit = 0;
    final char status = (char) (utfBit + langBytes.length);
    final byte[] data = Bytes.concat(new byte[] {(byte) status}, langBytes, textBytes);
    NdefRecord record = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data);
    try {
        NdefRecord[] records = {text};
        NdefMessage message = new NdefMessage(records);
        tag.connect();
        tag.format(message);
    }
    catch (Exception e){
        //do error handling
    }
    点对点数据交换

    前台推送技术支持简单点对点的数据交换,可以用enableForegroundNdefPush(Activity, NdefMessage)方法来打开此功能。

    使用此功能需要满足以下条件:

    • 推送数据的Activity必须是前台Activity。
    • 必须将要发送的数据封装到NdefMessage对象里。
    • 接收推送数据的设备必须支持com.android.npp NDEF推送协议,这对于Android设备是可选的。

    假如Activity打开了前台推送功能并且位于前台,这时标准的Intent发布系统是禁止的。然而,如果Activity允许前台发布系统,那么此时检测tag的功能仍然是可用的,不过只适用于前台发布系统。

    要打开前台推送需要:

    • 创建一个要推送给其他NFC设备的包含NdefRecords的NdefMessage。
    • 在Activity里覆盖onResume()和onPause()的回调来正确处理前台推送的生命周期。必须在Activity位于前台并在主线程里调 用enableForegroundNdefPush(Activity, NdefMessage) (可以在onResume()里调用来保证这点)。
    public void onResume() {
        super.onResume();
        if (mAdapter != null)
            mAdapter.enableForegroundNdefPush(this, myNdefMessage);
    }
    public void onPause() {
        super.onPause();
        if (mAdapter != null)
            mAdapter.disableForegroundNdefPush(this);
    }

    当Activity位于前台,可以靠近另外一个NFC设备来推送数据。可参考例子ForegroundNdefPush来了解点对点数据交换。


        
    [3] WP中的领航服务及不同页面间的参数传递方法
        来源: 互联网  发布时间: 2014-02-18
    WP中的导航服务及不同页面间的参数传递方法

    在Android应用中,我们使用Intent在不同页面之间进行导航,那么在Windows Mobile中,其对应物是什么呢?答案就是:

    NavigationService

    关于其类型定义及属性方法等,请参考MSDN站点。

    在不同页面间导航,就不可避免的遇到需要传递参数的情形。在Android应用中,我们可以方便的使用intent.putExtras来实现,在WP中则不行。下面介绍一下在WP中的传参方式。

    1. 对于简单的参数,可以直接将参数附在导航目标后,作为查询参数。
    例如:
    NavigationService.Navigate(new Uri("SecondPage.xaml?param1=1&param2=true", UriKind.Relative));
    在目标页面中,OnNavigateTo()方法中可以通过如下方式来读取参数:
    NavigationContext.QueryString.TryGetValue( "category", out category);
    NavigationContext.QueryString.TryGetValue( "title", out title);

    2. 利用PhoneApplicationService
    PhoneApplicationService有一个State属性,它是Dictionary类型的,允许你存取任意值。
    但也有其限制,放进State里的对象必须是可序列化的。

    PhoneApplicationService.Current.State["Color"] = clr; 

    3. 利用App类来共享数据
    应用中的所有页面都可以方便的访问Application的子类App。这样我们就可以利用Application.Current来获取App的实例,然后用它来共享不同页面间需要的数据。
    譬如,我们可以在App类中添加一个属性:
    public partial class App : Application
    {
    // public property for sharing data among pages
    public SharedParameter SharedParam { set; get; }
    }

    当需要传递数据时,在第一个页面的onNavigateFrom()方法里,将需要传递的参数赋给App的相应属性,在接下来的页面实例中就可以访问了。

    4. 在起始页面的OnNavigatedFrom方法中设置目标页面的属性。

    在目标页面中定义需要传递的属性:
     public ChannelItem selectedChannel { get; set; }

    在其实页面中通过设置NavigationEventArgs参数的Content属性来进行传递:
    protected override void OnNavigatedFrom(NavigationEventArgs args)
            {
                if (contentListBox.SelectedItem != null)
                {
                    if (contentListBox.SelectedItem is ChannelItem)
                    {
                        ChannelItem selectedItem = (ChannelItem)contentListBox.SelectedItem;

                        if (args.Content is RSSChannelPage)
                        {
                            (args.Content as RSSChannelPage).selectedChannel = selectedItem;
                        }
                    }
                }
            }

    以上方法均参考自《Programming Windows Phone7》 Chapter 6.

        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3