用Android模拟器也可以开发和测试NFC应用

| 收藏本文 下载本文 作者:Barbara

以下是小编收集整理的用Android模拟器也可以开发和测试NFC应用(共含10篇),仅供参考,希望对大家有所帮助。同时,但愿您也能像本文投稿人“Barbara”一样,积极向本站投稿分享好文章。

用Android模拟器也可以开发和测试NFC应用

篇1:用Android模拟器也可以开发和测试NFC应用

从Android2.3开始支持NFC,不过NFC应用只能在Android手机(或平板电脑)上测试和开发,而且Android手机还必须有NFC芯 片。而且如果测试NFC传输文件时至少需要两部支持NFC的手机。当然,如果测试读写NFC标签,还需要一些NFC标签或帖子。而且NFC在模拟器上时不 能运行的。所以从这一点来说,NFC开发需要更多的设备,比较麻烦。这也蓝牙、传感器是一样的。都不能在Android模拟器上开发和测试。真不知道 Google为什么不解决这一问题。

不过这种问题也不是不能解决,而且并不复杂。既然模拟器没有提供这样的功能。我们可以将NFC功能模拟出来(实际上,蓝牙、传感器都可以进行模拟,可能很 多读者用过一些传感器模拟软件,NFC模拟和这个类似)。而且要求是与真实的NFC环境无缝对接。也就是说,使用模拟NFC功能开发的Android应用 可以不需要修改一行代码,甚至不需要重新编译,就可以直接用在真实的NFC环境。

那么怎么解决这个问题呢?要想知道如何模拟NFC,需要先从宏观上了解NFC的工作原理。这里用NFC标签作为例子。NFC数据传输和这个类似。当NFC 标签靠近手机时,Android系统中有一个叫Nfc的系统应用(在/pakcages/apps/Nfc目 录中),该应用会发送一个Activity Action,该Action会调用一个在系统中注册的用于处理NFC请求的窗口(如果没有,就调用Nfc应用中默认的处理窗口)。这里的关键是 Activity Action。既然Nfc应用会发出一个Activity Action,那么用于模拟NFC的程序,也发送一个Activity Action,不就可以共享用于处理NFC请求的窗口(由用户建立的Activity)了吗?只要在发送Activity Action时加一个标志,就可以区分是Activity Action是Nfc系统应用发出的,还是模拟NFC的程序发出的。这样在处理请求的NFC窗口中就可以根据不同的情况进行处理。为了更透明,可以编写一 个Activity类(如NFCActivity),该类根据这两种情况进行处理。又因为不管是哪种情况,都需要提供写入NFC标签的数据,或接收NFC 标签中的数据。所以可以在该NFCActivity中提供一些回调方法,当需要提供或接收数据时,调用这些方法即可。最后需要使用NFC功能时,用户自己 编写的窗口类只需要从NFCActivity类继承,并实现相应的回调方法即可。例如,下面就是一个实现方法,可接收NFC标签的数据,并写入新数据。

复制代码

public class NFCManTestActivity extends NFCActivity

{

private NFCMan mNfcMan;

private EditText nfcTagText;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_nfcman_test);

nfcTagText = (EditText) findViewById(R.id.edittext_nfc);

mNfcMan = new NFCMan(this);

}

// 当NFC标签靠近手机时调用,data用于接收NFC标签中的数据,

// 返回值会重新写到NFC标签中

@Override

public String onNear(NFCData data)

{

// 返回要写入NFC标签的文本

return nfcTagText.getText.toString();

}

// 将数据成功写入NFC标签后会调用该方法

@Override

public void onNFCSuccess()

{

// 显示成功写入数据的提示

Toast.makeText(this, “成功写入数据”, Toast.LENGTH_LONG).show();

}

// 写入数据失败后调用该方法

@Override

public void onNFCFailed(int error, String errorMsg)

{

// 显示写入数据异常的编码和信息

Toast.makeText(this, “error:” + error + “n” + “msg:” + errorMsg,

Toast.LENGTH_LONG).show();

}

}

复制代码

从NFCManTestActivity类的代码可以看出,共有如下三个回调方法,

分别处理读写NFC标签数据,写入成功和写入失败三个事件。

onNear

onNFCSuccess

onNFCFailed

篇2:android NFC开发

先说说NFC开发总结,看了几天NFC开发资料,搜集了不少关于这方面的资料、demo、以及他人的总结,以下有部分是摘录总结的。因为要是现在总结也是那些,最后附送代码。关于demo我也有,有需要在评论去发邮箱给我。

一、NFC的配置总结

第一:屏幕没有锁住 。 第二:NFC功能已经在设置中打开

当系统检测到一个NFC标签的时候,他会自动去寻找最合适的activity去处理这个intent.

NFC发出的这个Intent将会有三种action:

ACTION_NDEF_DISCOVERED:当系统检测到tag中含有NDEF格式的数据时,且系统中有activity声明可以接受包含NDEF数据的Intent的时候,系统会优先发出这个action的intent。

ACTION_TECH_DISCOVERED:当没有任何一个activity声明自己可以响应ACTION_NDEF_DISCOVERED时,系统会尝试发出TECH的intent.即便你的tag中所包含的数据是NDEF的,但是如果这个数据的MIMEtype或URI不能和任何一个activity所声明的想吻合,系统也一样会尝试发出tech格式的intent,而不是NDEF.

ACTION_TAG_DISCOVERED:当系统发现前两个intent在系统中无人会接受的时候,就只好发这个默认的TAG类型的

二、NFC相关androidManifest文件设置

首先是权限:

然后是sdk级别限制:我个人建议API11开始比较合适:

如果是API8,在代码中,nfc功能设置的代码会出错,要抛出

例如:

NfcAdapter mAdapter = NfcAdapter.getDefaultAdapter(this);

mAdapter.isEnabled()

接着是特殊功能限制:

这个生命可以让你的应用在googleplay上被声明使用者必须拥有nfc功能。

三、NFC标签过滤,也在androidManifest文件设置

在activity的intent过滤xml声明中,你可以同时声明过滤这三种action.但是由之前所说,你应该知道系统在发送intent的时候是有优先级的,所以你最好清楚自己最想处理哪个。

1:过滤ACTION_TAG_DISCOVERED:

这个最简单,也是最后一个被尝试接受intent的选项。

2:过滤ACTION_NDEF_DISCOVERED:

其中最重要的应该算是data的mimeType类型了,这个定义的越准确,intent指向你这个activity的成功率就越高,否则系统可能不会发出你想要的NDEF intent了。下面在讲如何使用NDEF写入NFC标签的时候会多举几个类型的例子。

3:过滤ACTION_TECH_DISCOVERED:

你首先需要在你的

/res/xml下面创建一个过滤规则文件。名字任取,比如可以叫做nfc_tech_filter.xml。这个里面定义的是nfc实现的各种标准,每一个nfc卡都会符合多个不同的标准,个人理解为这些标准有些相互之间也是兼容的。你可以在检测到nfc标签后使用getTechList()方法来查看你所检测的tag到底支持哪些nfc标准。

一个nfc_tech_filter.xml中可以定义多个结构组。

android.nfc.tech.IsoDepandroid.nfc.tech.NfcAandroid.nfc.tech.NfcBandroid.nfc.tech.NfcFandroid.nfc.tech.NfcVandroid.nfc.tech.Ndefandroid.nfc.tech.NdefFormatableandroid.nfc.tech.MifareClassicandroid.nfc.tech.MifareUltralight

在androidManifest文件中声明xml过滤的举例如下:

四、看具体代码:

1、主要代码实现如下:

package org.reno.Beam;import java.io.ByteArrayOutputStream;import java.nio.charset.Charset;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import java.util.Locale;import org.nfc.read.ParsedNdefRecord;import android.app.Activity;import android.app.AlertDialog;import android.app.PendingIntent;import android.content.DialogInterface;import android.content.Intent;import android.nfc.NdefMessage;import android.nfc.NdefRecord;import android.nfc.NfcAdapter;import android.nfc.Tag;import android.nfc.tech.MifareClassic;import android.nfc.tech.MifareUltralight;import android.os.Bundle;import android.os.Parcelable;import android.provider.Settings;import android.widget.TextView;public class MainActivity extends Activity { private static final DateFormat TIME_FORMAT = SimpleDateFormat .getDateTimeInstance(); private NfcAdapter mAdapter; private PendingIntent mPendingIntent; private NdefMessage mNdefPushMessage; private TextView promt; private AlertDialog mDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); promt = (TextView) findViewById(R.id.promt); resolveIntent(getIntent()); mDialog = new AlertDialog.Builder(this).setNeutralButton(“Ok”, null) .create(); // 获取默认的NFC控制器 mAdapter = NfcAdapter.getDefaultAdapter(this); //拦截系统级的NFC扫描,例如扫描蓝牙 mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); mNdefPushMessage = new NdefMessage(new NdefRecord[] { newTextRecord(“”, Locale.ENGLISH, true) }); } @Override protected void onResume() { super.onResume(); if (mAdapter == null) { if (!mAdapter.isEnabled()) { showWirelessSettingsDialog(); } showMessage(R.string.error, R.string.no_nfc); promt.setText(“设备不支持NFC!”); return; } if (!mAdapter.isEnabled()) { promt.setText(“请在系统设置中先启用NFC功能!”); return; } if (mAdapter != null) { //隐式启动 mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null); mAdapter.enableForegroundNdefPush(this, mNdefPushMessage); } } @Override protected void onPause() { super.onPause(); if (mAdapter != null) { //隐式启动 mAdapter.disableForegroundDispatch(this); mAdapter.disableForegroundNdefPush(this); } } //16进制字符串转换为String private String hexString = “0123456789ABCDEF”; public String decode(String bytes) { if (bytes.length() != 30) { return null; } ByteArrayOutputStream baos = new ByteArrayOutputStream( bytes.length() / 2); // 将每2位16进制整数组装成一个字节 for (int i = 0; i < bytes.length(); i += 2) baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString .indexOf(bytes.charAt(i + 1)))); return new String(baos.toByteArray()); } // 字符序列转换为16进制字符串 private static String bytesToHexString(byte[] src, boolean isPrefix) { StringBuilder stringBuilder = new StringBuilder(); if (isPrefix == true) { stringBuilder.append(“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.toUpperCase(Character.forDigit( (src[i] >>> 4) & 0x0F, 16)); buffer[1] = Character.toUpperCase(Character.forDigit(src[i] & 0x0F, 16)); System.out.println(buffer); stringBuilder.append(buffer); } return stringBuilder.toString(); } private void showMessage(int title, int message) { mDialog.setTitle(title); mDialog.setMessage(getText(message)); mDialog.show(); } private NdefRecord newTextRecord(String text, Locale locale, boolean encodeInUtf8) { byte[] langBytes = locale.getLanguage().getBytes( Charset.forName(“US-ASCII”)); Charset utfEncoding = encodeInUtf8 ? Charset.forName(“UTF-8”) : Charset .forName(“UTF-16”); byte[] textBytes = text.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1 << 7); char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length]; data[0] = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); } private void showWirelessSettingsDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(R.string.nfc_disabled); builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) {Intent intent = new Intent( Settings.ACTION_WIRELESS_SETTINGS);startActivity(intent); } }); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i) {finish(); } }); builder.create().show(); return; } //初步判断是什么类型NFC卡 private void resolveIntent(Intent intent) { String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent .getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage[] msgs; 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[0]; byte[] id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID); Parcelable tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); byte[] payload = dumpTagData(tag).getBytes(); NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN,empty, id, payload); NdefMessage msg = new NdefMessage(new NdefRecord[] { record }); msgs = new NdefMessage[] { msg }; } // Setup the views buildTagViews(msgs); } } //一般公家卡,扫描的信息 private String dumpTagData(Parcelable p) { StringBuilder sb = new StringBuilder(); Tag tag = (Tag) p; byte[] id = tag.getId(); sb.append(“Tag ID (hex): ”).append(getHex(id)).append(“n”); sb.append(“Tag ID (dec): ”).append(getDec(id)).append(“n”); sb.append(“ID (reversed): ”).append(getReversed(id)).append(“n”); String prefix = “android.nfc.tech.”; sb.append(“Technologies: ”); for (String tech : tag.getTechList()) { sb.append(tech.substring(prefix.length())); sb.append(“, ”); } sb.delete(sb.length() - 2, sb.length()); for (String tech : tag.getTechList()) { if (tech.equals(MifareClassic.class.getName())) { sb.append('n'); MifareClassic mifareTag = MifareClassic.get(tag); String type = “Unknown”; switch (mifareTag.getType()) { case MifareClassic.TYPE_CLASSIC: type = “Classic”; break; case MifareClassic.TYPE_PLUS: type = “Plus”; break; case MifareClassic.TYPE_PRO: type = “Pro”; break; } sb.append(“Mifare Classic type: ”); sb.append(type); sb.append('n'); sb.append(“Mifare size: ”); sb.append(mifareTag.getSize() + “ bytes”); sb.append('n'); sb.append(“Mifare sectors: ”); sb.append(mifareTag.getSectorCount()); sb.append('n'); sb.append(“Mifare blocks: ”); sb.append(mifareTag.getBlockCount()); } if (tech.equals(MifareUltralight.class.getName())) { sb.append('n'); MifareUltralight mifareUlTag = MifareUltralight.get(tag); String type = “Unknown”; switch (mifareUlTag.getType()) { case MifareUltralight.TYPE_ULTRALIGHT: type = “Ultralight”; break; case MifareUltralight.TYPE_ULTRALIGHT_C: type = “Ultralight C”; break; } sb.append(“Mifare Ultralight type: ”); sb.append(type); } } return sb.toString(); } private String getHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = bytes.length - 1; i >= 0; --i) { int b = bytes[i] & 0xff; if (b < 0x10) sb.append('0'); sb.append(Integer.toHexString(b)); if (i > 0) { sb.append(“ ”); } } return sb.toString(); } private long getDec(byte[] bytes) { long result = 0; long factor = 1; for (int i = 0; i < bytes.length; ++i) { long value = bytes[i] & 0xffl; result += value * factor; factor *= 256l; } return result; } private long getReversed(byte[] bytes) { long result = 0; long factor = 1; for (int i = bytes.length - 1; i >= 0; --i) { long value = bytes[i] & 0xffl; result += value * factor; factor *= 256l; } return result; } //显示NFC扫描的数据 private void buildTagViews(NdefMessage[] msgs) { if (msgs == null || msgs.length == 0) { return; } // Parse the first message in the list // Build views for all of the sub records Date now = new Date(); List

records = NdefMessageParser.parse(msgs[0]); final int size = records.size(); for (int i = 0; i < size; i++) { TextView timeView = new TextView(this); timeView.setText(TIME_FORMAT.format(now)); ParsedNdefRecord record = records.get(i); promt.append(record.getViewText()); } } //获取系统隐式启动的 @Override public void onNewIntent(Intent intent) { setIntent(intent); resolveIntent(intent); }}

2、androidManifest配置

篇3:android应用开发就业前景

Android是目前市场上占有率最大,全球覆盖率最广的手机操作系统,拥有相当多的手机用户群,所以对于Android相关的应用软件也有着相当大的需 求量。为了开发功能更丰富,应用更强大的软件,企业急需招聘Android技术人才。而Android进入中较晚,人才缺口达30万,很多企业不惜高薪挖 角,Android开发工程师的工资也是水涨船高。所以如果选择一家专业的机构培训,学习与企业需求相契合的技术,毕业后完全不用担心找不到工作。像武汉 大学深圳研究院毕业的学员,平均薪水都在五千以上,加之相关福利,完全可以满足大学生的心里预期。

小王毕业于北京某一大专院校,是武汉大学深圳研究院的android学员,目前就职于深圳某知名手机软件开发公司,从事Android开发。

他在大学时候学的是软件技术,大家都知道做技术的没有一定的项目经验和非常好的基础是很难找到工作的,毕业以后小王找了很多的公司面试,但都是因为没有项目实战经验,面试均以失败告终。于是他就有了参加培训的想法。

一次偶然的机会,他看到了武汉大学深圳研究院Mark老师的Android教学视频,他被Mark老师的教学风格深深吸引了,所以他就选择了武汉大学 深圳研究院Android开发培训。每天武汉大学深圳研究院的同学们都拼命的学,刚开始的时候小王还有点不适应,因为在学校的时候大家都懒散惯了,后来就 适应了,而且每天都很充实,这种充实的感觉让他似曾相识,感觉非常的好。在武汉大学深圳研究院学了4个月后,小王经过武汉大学深圳研究院相关老师的推荐找 到了公司,从事android开发对口工作。因为有了目标。让他对未来充满了希望。

武汉大学深圳研究院Android开发课程学时四个月,学员学习后可以掌握实用性最强、最新的技术,具备独立开发项目的能力。不再是空有一张文凭的文 弱书生,而是有项目经验,技术过关的开发人才。不但可以就职理想的公司,薪水也高出同届毕业生。今天迈出一小步,也许就是未来通向成功的一大步!随着 Android开发技术的不断壮大,未来Android开发工程师必将成为含金量最高的职业。

[android应用开发就业前景]

篇4:用可以也可以造句

用可以也可以造句

1、中秋佳节,融和天气,可以香车访友,可以酬礼亲朋,可以家庭欢聚,也可以诵月一首以怀古人。

2、学好英语可以看外国电影,可以听外国音乐,可以做翻译工作,也可以与外国人交朋友 。

3、时间可以冲淡一切,但也可以证明一切。

4、我可以看书,也可以写作业。

5、爸爸说中秋节我干什么都行,可以吃好吃的,可以穿新衣服,可以去电影院,也可以去旅游。

6、放学了,爸爸可以来接我,妈妈也可以来接我

7、手机可以用来打电话,也可以用来玩游戏。

8、黄瓜可以吃也可以用来美容。

9、这位先生你可以吃完饭再出去溜达 也可以溜达完再吃饭。

10、妈妈,你可以打我,也可以骂我,但你不能离开我

11、水可以喝,可以洗衣服,可以浇花,也可以用来发电。

12、小明可以演讲,也可以唱歌。

13、豆腐可以炒、可以炸、可以腌制、还可以熬汤 。

14、你可以摘一些花,也可以种一些花

15、上网时,可以聊天也可以玩游戏。

16、电脑可以用来学习,可以玩游戏,可以看新闻,也可以交友。

17、这种方便面可以干着吃,也可以泡着吃。

18、文具盒可以装笔也可以装橡皮擦。

篇5:从零开始学Android应用安全测试(Part3)

在本节中内容中,我们将看看如何对安卓应用程序中的组件进行攻击测试,阅读前两节(www.2cto.com/Article/04/388673.html,www.2cto.com/Article/201504/388674.html)

在此之前,你的理解安卓应用程序中的组件是何方神圣。安卓组件是构成安卓应用的基础,这些组件都可以在安卓manifest.xml文件中去配置。这里我们简单的介绍其中四种相对来说较为重要的组件。

组件            描述

Activities          控制用户UI,处理用户在智能手机屏幕上的交互

Services           无须可视化界面,提供后台长时运行的功能

Broadcast Receivers        处理安卓应用程序与安卓系统之间的通信

Content Providers        处理数据与数据库之间的管理问题

Activities

一个Activity组件代表一个简单的用户界面。举例子说,Email应用可能有一个Activity组件用来显示新邮件列表,一个Activity组件用来写邮件,再有一个Activity组件用来读取邮件。一个Activity是一个界面,多个Activity表示多个界面。

一个Activity作为Activity class的子类执行,如下

public class MainActivity extends Activity {

}

Services

Services是一个提供后台长时间运行的组件。比如当你在听音乐的时候你依旧可以正常使用其他应用,再或者你也能够打开网络连接上网,而不影响用户的交互行为。

一个Services作为Services Class的子类执行,如下

public class MyService extends Service {

}

Broadcast Receivers

广播只是回应来自系统或者其他应用的广播消息。比如,应用程序可以启动广播告知其他应用设备中已经存在的数据,以及可以使用的数据等等。

一个Broadcast Receivers作为Broadcast Receivers Class的子类执行,如下

public class MyReceiver extends BroadcastReceiver {

}

Content Providers

Content Providers组件存储和取得数据,以及让它对所有应用程序可见。Android整理了一大堆content provider给公共数据类型(音频、视频、图像、联系人信息等等)。

一个Content Providers作为Content Providers Class的子类执行。必须使用一个标准的API,这样其他应用程序才能执行协议

public class MyContentProvider extends ContentProvider {

}

附加组件

以下这些组件可能我们也会用到,这里暂且简单的介绍一下。

组件            介绍

Fragments          Fragment表现Activity中用户界面的一个行为或者是一部分,

Views           是最基本的UI类,基本上所有的高级UI组件都是集成子View类的实现。

Layouts           Layout 是一个可横向和纵向排列布局的一个容器,布局组件。

Intents           Intent本身为一个数据载体,可以描述想要执行的操作以及用于这个操作的数据和其它属性

Resources          外部元素,比如字符串,常量,图片等等。

Manifest           应用配置文件

Android:exported

组件的中最重要的属性就是android:exported,以下文字来自于安卓官方文档

这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。

它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。

这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。

因此,如果一个Activity属性为exported,那么他就可以调用外部应用程序。为了测试InsecureBank应用中的Activity,我们首先打开Genymotion模拟器中的InsecureBank应用并启动后端服务。

一旦我们启动这个应用,我们就可以看到这个登录界面。如果登录成功过后activity的属性为exported,我们就可以直接调用activity

接着我们来看看manifest文件,或许我们能够找到相关的activity。如下图所示,首先使用apktool解压应用

下面就是manifest文件的样子咯。正如你看到的,有一个名为.PostLogin的Activity组件属性为exported

我们可以在模拟器中使用activity manager工具直接调用这个activity,我们来看看吧

使用am tool启动一个activity,命令如下

adb shell

am start -n com.package.name/com.package.name.ActivityName

在这个例子中,我们可以在manifest文件中看到这个包的名字为com.android.insecurebankv2

所以,我们使用如下所示命令来调用PostLogin activity

在这个应用中,你可以看到你已经成功绕过了登录页面

你也可以使用drozer调用Activity或者其他组件,下一节我们来介绍drozer。

这里有几个方法可以防止这类漏洞。

首先,除非真的有必要,请将android:exported 属性设置为FALSE

其次,如果应用需要调用特定的外部应用程序,你可以为activity组件增加自定义权限,仅仅允许应用程序请求权限调用activity组件。

在下一节开始之前,请大家预习一下安卓manifest文件,以及安卓应用程序中的不同组件。

篇6:从零开始学Android应用安全测试(Part1)

在本系列文章中,利用InsecureBankv2这款含有漏洞的安卓应用,我们可以了解到有关安卓应用安全的种种概念,我们将从一个新手的角度看待每一个问题。所以,我建议新手朋友可以关注下本系列文章。

由于教程是从零开始,前面的东西不免会比较基础,老鸟请先飞过吧。

移动渗透平台搭建

在对安卓应用测试之前,我们需要搭建一个合适的移动渗透平台。

首先,我们需要下载Eclipse ADT bundle,并安装。这里我就不再过多重复造轮子的事情了。

这里面有俩个文件夹,一个叫 tools,另外一个叫做platform-tools。这俩是非常重要的,是需要加入环境变量里面的。以下命令可以用来添加路径到环境变量中

export PATH=/path/to/dir:$PATH.

将tools和platform-tools文件夹都添加到环境变量中,完成操作过后,你就可以随意的使用所有的命令了。然后检查是否工作,可以键入adb命令,你可以得到以下的输出结果。

为了保证应用能够在我们的计算机上运行,我们还需要一款趁手的模拟器。Eclipse Android Virtual Device就是一款安卓模拟器,如何进行创建虚拟设备,朋友们可以在网上搜搜。然而,对于本系列文章,我会使用另一款工具Genymotion 来创建虚拟设备。这里有许多原因,其一是处理速度比较快,其二使用Genymotion创建的虚拟设备默认是自动获取了root权限的。这也就意味着,你可以自由的安装应用,对于审计安卓应用也方便。

完成Genymotion的安装后,你需要注册一个账号(免费的)并基于你的需求创建不同模拟器。

好了,现在我们就将InsecureBankv2的源代码从github上克隆过来。

打开你创建的虚拟设备,这一步骤十分简单。

在刚才从github克隆的项目文件中,存在一个apk文件。你可以使用adb install InsecureBankv2.apk 命令来安装这个应用。

在上图中你可以看到success,这就表示这个apk文件已经成功安装了,同时你在模拟的设备中看到对应的应用图标,

但是有时候你可能只是想编译这个文件而不是运行这个apk文件。这个时候你就需要打开Eclipse找到 File -> Switch Workspace,选择你创建的 Insecurebank文件夹,然后转到File -> Import并选择现有的Android代码放进工作区。

选择应用程序所在的文件夹,你可以看到Eclipse已经将应用程序放进了你的工作区。

这时候你就可以点击上端的play按钮,开始运行这个应用。在保证模拟器正常运行的情况下,选择运行安卓应用。

不出意外,这时候你就可以看到应用在模拟器中成功运行了。

同时启动后端的python服务,可以使用这个命令

python app.py –port 8888

在这个应用中填入ip地址以及端口。

现在你就可以使用默认凭证登录这个应用了。

dinesh/Dinesh@123$

jack/Jack@123$

请确保你安装了以下工具,在我们以后讨论的细节中,会用到的。

Drozer

Andbug

Introspy

dex2jar

apktool

另外,可以使用adb shell连接你的模拟器,然后看看你想要做些什么。

下节预告

在下一篇文章中,我们将了解下InsecureBankv2项目中存在的各种漏洞,更详细的了解安卓应用的安全性。

InsecureBankv2项目地址:github.com/dineshshetty/Android-InsecureBankv2

Eclipse ADT bundle:developer.android.com/sdk/installing/?pkg=adt

篇7:Android开发之TextView高级应用

我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此,下面就和大家分享一下TextView的一些使用技巧。

Android中设置文本样式的几种方法:

1.将android:autoLink属性值设为true。系统会自动识别E-mail、电话、网址等特殊文本。

2.使用Html标签,例如,、等。不要设置 android:autoLink 属性。

3.在Java代码中直接使用Span对象来设置文本样式。这种方法需要将文本转换成一个SpannableString或SpannableStringBuilder对象,然后在SpannableString或SpannableStringBuilder对象中使用setSpan方法将要设置样式的文本转换成相应的Span对象。

4.在字符串资源中使用标签(只支持标签)设置可单击的链接,不要设置android:audoLink属性。

上面4种方法只要涉及单击动作,就必须使用TextView.setMovementMethod方法设置相应的MovementMethod对象。

1.在TextView中显示图像

我们浏览网的时候,上面的有很多图文并茂的文章,这些文章大部分都是从服务器的数据库中取出并显示在网页上的。那么如何在网页上显示图文并茂的文章呢?有过Java Web或.NET开发经验的人,会说用s:textfield或asp:label绑定。用它们是因为它们可以将标签的src对应的图像地址(也是图像资源的唯一标识)直接交给浏览器出处理。这样就可以将的src对应的图片显示出来。

那么,在Android中如何用TextView显示图片呢?

在解析Html标签来方面Android系统没有浏览器那么强大,Android系统不会直接根据src属性说指向的的值自动获取并显示图片,这一切都需要我们来帮它来完成。说白了,src属性指的是什么只有开发者自己知道。开发者需要告诉系统src属性到底指的是什么,然后系统才会知道怎么做。

解析src属性值需要ImageGetter对象的getDrawable方法来完成。ImageGetter是一个接口。使用Html.fromHtml会使这一过程变得简单。(关于Html.fromHtml的介绍)

txtShow=(TextView)findViewById(R.id.txtShow);

String htmlText=“小黄人1号:” +“小黄人2号:”+“小黄人3号:”;

txtShow.setText(getSpanned(htmlText));/**

*将Html解析成样式文本

*@return spanned Spanned

* */

private Spanned getSpanned(String htmlText) {

//TODO Auto-generated method stub

Spanned spanned=Html.fromHtml(htmlText,new ImageGetter { @Override

public Drawable getDrawable(String source) {

//TODO Auto-generated method stub

//装在图像资源

Drawable drawable=getResources().getDrawable(getResourceId(source));

if(source.equals(“blog.csdn.net/fengyuzhengfan/article/details/xiaohuangren1”)) {

//设置图像的缩放

drawable.setBounds(0, 0, 56, 56);

}elseif(source.equals(“blog.csdn.net/fengyuzhengfan/article/details/xiaohuangren2”)) {

//设置图像的缩放

drawable.setBounds(0, 0, 36, 36);

}elseif(source.equals(“blog.csdn.net/fengyuzhengfan/article/details/xiaohuangren3”)) {

//设置图像缩放到原来的75%

drawable.setBounds(0, 0,(int) (drawable.getIntrinsicWidth()*0.75),

(int) (drawable.getIntrinsicHeight()*0.75));

}

return drawable;

}

},null);

return spanned;

}

/**

*利用反射技术从R.drawable类中通过图像资源文件名获得相应图像资源的ID

*@param name String图像资源名

*@return图像资源ID int

* */

protectedint getResourceId(String name) {

//TODO Auto-generated method stub

try {

//根据资源ID的变量名(也就是图像资源的文件名)获取Field对象

Field field=R.drawable.class.getField(name);

//取得并返回资源ID的值

return Integer.parseInt(field.get(null).toString());

}catch (Exception e) {

//TODO: handle exception

}

return 0;

}

2.单击TextView中的内容打开指定Activity

虽然TextView可以自动识别特殊文本(网址、电话号、E-mail等),并可以通过单击触发不同的动作,但是如果开发者想通过单击链接来显示指定的组件(如Activity、Service等)那么怎么来实现呢?

TextView自动识别的网址、电话号、E-mail等,都是在ClickableSpan类的onClick方法中通过Action调用相应的组件来实现的。现在我们就采用类似的方法,通过自己实现onClick方法来达到自定义自定义单击动作的目的。

/**

*单击TextView中的内容启动指定组件

* */

privatevoid launchComponentByTextView() {

//TODO Auto-generated method stub

txtLink=(TextView)findViewById(R.id.txtLink);

String str=“单击我启动一个Activity”;

//将文本转换成SpannableString对象

SpannableString spannableString=new SpannableString(str);

//将spannableString所有文本设置成ClickableSpan对象,并实现onClick方法

spannableString.setSpan(new ClickableSpan() {

@Override

publicvoid onClick(View widget) {

//TODO Auto-generated method stub

//启动指定Activity

Intent intent=new Intent(MainActivity.this, SecondActivity.class);

startActivity(intent);

}

}, 0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

txtLink.setText(spannableString);

//在单击链接时凡是要执行的动作,都必须设置MovementMethod对象

txtLink.setMovementMethod(LinkMovementMethod.getInstance());

}实例分析:

篇8:android C编程技巧 及 C/C++开发测试

运行模拟器

emulator -console

* 将文件写入到模拟器的userdata.img文件中

adb push

*将一个目录拷贝到模拟器中,包括子目录

adb push

* 将一个目录从模拟器中拷出来

adb pull

* 使得模拟器可以运行arm代码.

使用GNU/ARM Linux编译器编译你的应用程序就可以了

* 在模拟器里面运行shell,需要先运行模拟器

adb shell

*运行模拟器中的一个控制台程序

adb shell

*连接模拟器的控制台

telnet localhost 5554/6/8

运行C程序

参考文献

Native C “Hello World” working in emulator

groups.google.com/group/a ... wse_thread/threa...

Native C Applications for Android

benno.id.au/blog//11/13/android-native-apps

步骤

* 下载GNU/ARM编译工具

www.codesourcery.com/gnu_toolchains/arm/download.html

* 编写c/c++代码.

* 使用GNU/ARM Linux 工具创建一个应用程序,不使用动态链接库

ex. arm-none-linux-gnueabi-g++.exe -static -o hello HelloAndroid.cpp

* 启动模拟器

$SDK_ROOT/tools/emulator.exe

* 在命令行窗口运行 abd将编译好的hello程序放入模拟器的磁盘

adb push hello /system/sbin/hello

* 让hello文件变成可执行程序,不要使用 chmod ugo+x

adb shell chmod 777 /system/sbin/hello

* 运行hello程序

adb shell

cd /system/sbin/

hello

EXAMPLE HELLO WORLD CODE

//

// HelloAndroid.cpp

//

//

#include

using std::cin;

using std::cout;

using std::endl;

class MyName

{

public:

void getname( void );

void sayhello( void );

private:

char name[ 255 ];

};

void MyName::getname( void )

{

cout << “What is your name? ”;

cin >> name;

}

void MyName::sayhello( void )

{

cout << “Welcome ” << name << “ to the world of Android” << endl;

}

MyName name;

int main( int argc, char *argv[] )

{

name.getname();

name.sayhello();

return 0;

}

Android编译本地C++程序方法

在Android平台上程序以Java形式运行在Dalvik模拟器上,但Android作为一个Linux内核系统完全可以执行Navtive C++程序,主要的步骤如下:

1.下载ARM C++交叉编译器www.codesourcery.com/gnu_toolchains/arm/portal/subscription3057

2.编写本地C++代码,如Hello Wolrd,可以使用标准库STL,

android C编程技巧 及 C/C++开发测试

编译的命令行如下

arm-none-linux-gnueabi-g++.exe -static -oandroid123 android123.cpp

首先运行arm-none-linux-gnueabi-g++.exe程序-static 参数代表静态库,-o为输出名称android123,最后的android123.cpp为源代码。

3.运行模拟器,用cmd在sdkTools目录夏之星 adb pushandroid123 /system/sbin/android123

4.设置访问权限,通过Linux的Shell,在cmd下设置所有用户完全控制权限adb shell chmod 777 /system/sbin/android123

5.执行这个android123程序,输入adb shell cd /system/sbin/android123即可

在android平台上测试C/C++程序及库

int main( int argc, char *argv[] )

{

name.getname();

name.sayhello();

return 0;

android平台上带有标准C库,我们可以写个C程序来试试看能不能在上面运行。。。

首先下载并安装交叉编译工具GNU/ARM Linux gcc:

www.codesourcery.com/gnu_toolchains/arm/download.html

安装时 直接解压就行了,要设置好PATH环境变量。

简单的C代码:

test.c

#include

int main()

{

int i,j;

for(i=0;i<=10;i++)

{

for(j=0;j<=i;j++)

printf(”*”);

printf(”n”);

}

return 0;

}

用刚下载的交叉编译工具编译源代码:

# arm-none-linux-gnueabi-gcc test.c -o test -static

-static选项在这里是必须的,不然android平台就不运行此程序。

这也说明了此平台上的C/C++库是不能被C/C++程序动态连接的 。

进入tools目录,用adb工具下载到android平台,放到/data/data目录。

# ./adb push test /data/data

进入/data/data目录运行程序。

# cd /data/data

# ./test

*

**

***

****

*****

******

*******

********

*********

**********

***********

ok,It’s done !

C++程序一样的方法,只不过编译器换成:arm-none-linux-gnueabi-g++

附C++示例代码:

//

// HelloAndroid.cpp

//

//

#include

using std::cin;

using std::cout;

using std::endl;

篇9:Adobe AIR for Android:用Flash制作Android应用

今天来教大家如何发布你的Flash App , 到Mobile上,

软体需求:

Adobe Flash CS5.5 或是Adobe Flash Builder4.5

在这以Flash CS5.5 来做教学

开启新档,选择AIR for Android

制作方法就和一般的flash 写法都一样

但要注意一些小细节

1:尽量使用点阵图而不要用相量

Flash CS5.5 在物件的面版上,提供了新的方法,让你可以在编译后,帮你把MovieClip 直接输出成点阵图

使用这个功能,该MovieClip 就变成了一张图档, 里面的功能会失效

另一个方法是全选你的相量物件,按一下右键后,会出现Convert to Bitmap

2:不要使用filter, blend mode, alpha

这些都是很占用效能的步骤

Publish

General:

Output file:要输出的apk 档名

App name:你的app 名称,会出现在Android 上icon 的名称

App ID:这个跟上传到android Market 上会有很重要的关系

当你第一次上传apk 后, 之后每次更新的apk 档, 该App ID 都要一样,否则不能上传

Version:一样和上到到android Market 有关,新的apk 版本号要比前一版高才能上传。

Version label:这个只是显示用。

Aspect ratio:可以指定是Portrait (直), Landscape(横) 或是Auto(自动)

Full screen:打勾的话,你的app 会满版,没有的话,上面会保留Android 的Tital Bar

Auto orentation:是否自动旋转。

Render mode:一般flash 都是透过CPU 在运算, 在Mobile 上,可以选择GPU 加速。

Included files:编译成apk 时,同时把另外的档案也加入,如图片或是sqlite等。

Deployment:

Certificate:验证档, 你可以按最右边的Create 产生一个属于自己的验证档

Password:你的验证档密码

Android deployment type:

在这虽然有Emulator 的选项,但更新到AIR2.6 后,装上去执行都会出现Error,如果有人测成功的话再麻烦告知方法,

还是乖乖选择Device release 吧

Get AIR runtime from:如果使用者安装你的apk , 发现没有AIR runtime 时,会到那儿下载

预设就选Google Android Market吧

Icons:

Android 有三种Size , 36×36 , 48×48, 72×72

Permissions:

这里跟Android 的Permissions 是一样的,只是目前AIR for Android 还没有那么多可以选

如果你有需要用到特别的功能,都需要在这儿打勾才可以使用

比如说你要使用Camera , 就要选 CAMERA

要录音,就要选RECORD_AUDIO

安装Android SDK

developer.android.com/sdk/

接上你的Andr漠挡 手机, 按下l怖, 就可以成功上传到你的手机上了。

关于catchAsBitmap 和catchAsBitmapMatrix

在AIR2.6 里

所有的DisplayObject 多了一个catchAsBitmapMatrix 可以使用

看一下官方文件的说明

简单来说,就是你的物件只有move, rotation, alpha , scale 等动作时

可以开启这样的属性,会让你的效能更佳

而另一个cacheAsBitmap 指的是如果物件只有移动的话,开启该属性效能会更佳

所以我就针对

什么都不开启

开cacheAsBitmap

开cacheAsBitmap和cacheAsBitmapMatrix

并配合二种动作方试来做测试

测试的结果:

什么都不开,二种动作都会lag

只开cacheAsBitmap, 在只有移动时,效能优,但如果加上rotation 之类的话,比什么都不开还要慢

开cacheAsBitmapMatrix, 效能最优

祝大家学习愉快

补充一下:

你的Android手机必需是2.2 以上版本

同时CPU 是v6 以上,才能安装AIR runtime.

篇10:用英语发牢骚 ?你也可以

在公司里,你也许是个秘书,你也许是管理财务的人员,你也许负责管理档案,你也许负责管理人力资源,总之几乎你得天天待在办公室里,坐在办公桌旁处理堆积如山的文件,每天你有许许多多的杂事要处理,每天你有快乐,但更多的是不顺心,因为你是人,你需要与周围的同事和平共处,你需要克制忍耐;可又因为你是有血有肉的活生生的人,你要发泄(否则你会得心脏病),你要抱怨(因为憋在肚子里你会感到对不起自己):为什么你总是在办公室里抽烟?为什么他工作中总是犯这样那样的错误,害得我要在他的后面忙来忙去?为什么一到快要下班了,他们还要给我这么多工作?谁又拿我的钢笔了?害得我找也找不到。这些事情虽然琐碎,但也许你每天都要碰到。

下面是一些例句,你或许会从中学会怎样用英语发牢骚:

1. Yech...it is a beautiful day out. And here I am stuck inside the office with all this paper work。

哎,外面天气那么好,我却得守在办公室内处理这些文件。

2. How am I to know what I'm supposed to do if there's no organization around here?

如果这里那么没有条理,我怎么晓得该做些什么好呢?

3.The company is so cheap we have to sharpen our pencils until they're down to little stubs like this。

公司这么吝啬,害得我们得把铅笔用到这么短。

4.Now where did my eraser go this time? Don't take things off other people's desks without asking them,O.K.?

这回我的橡皮又到哪里去了?不要不说一声就拿别人桌子上的东西,好吗?

5.I want you to stop hogging my desk space, all right?

你不要再占用我的桌子,好吗?

6.Turn the other way when you smoke, so I won't have to breathe it, all right?

你抽烟时转向那一边,免得我吸到,行不行?

7.Don't talk to me while I'm in the middle of calculatin。

我在计算时,别跟我说话。

8.Ah, heck! Another mistake.The staff here can't even use their calculators right!

真见鬼!又错了。这里的职员连计算器都不能正确使用。

9.Oh,why did he have to give me this rush job now that it's almost time for my lunch break!

哎,快到午餐休息时间了,他为什么非给我这个急件不可!

10.I know I made a mistake. I just wish he wouldn't keep hammering away at it。

我知道我犯错误了。我真希望他不要一直骂个不停。

11.Doing this mindless work all day is going to drive me crazy。

整天做这种不用动脑筋的工作,会使我发疯的。

12.Why do I have to do all these extra needless little jobs anyway?

不管怎样,为什么我得做所有这些多余的、不必要的琐碎工作?

13.How come everyone in our company is middle-aged stuffy?

为什么我们公司都是一些古板的中年人?

14.Everytime he gets drunk,he goes into lousy preaching routine。

每次喝醉,他就开始他那令人讨厌的说教。

15.I don't understand what's going on inside these young people's heads。

我不了解这些年轻人的脑子里想的是什么。

16.Say, don't you think Miss Black is using the phone too much for personal calls?

喂,你不觉得布莱克小姐的私人电话打得太多吗?

海水资源的开发和应用说课稿

人工湿地在湖水净化和中水回用中的应用论文摘要

用Android模拟器也可以开发和测试NFC应用(整理10篇)

欢迎下载DOC格式的用Android模拟器也可以开发和测试NFC应用,但愿能给您带来参考作用!
推荐度: 推荐 推荐 推荐 推荐 推荐
点击下载文档 文档为doc格式

相关文章

热门推荐

HOT

猜你喜欢

NEW
点击下载本文文档