android

阅读 / 问答 / 标签

Android WiFi开发,如何自动连接的代码

public class WifiAutoConnectManager {private static final String TAG = WifiAutoConnectManager.class.getSimpleName();WifiManager wifiManager; // 定义几种加密方式,一种是WEP,一种是WPA,还有没有密码的情况 public enum WifiCipherType { WIFICIPHER_WEP, WIFICIPHER_WPA, WIFICIPHER_NOPASS, WIFICIPHER_INVALID } // 构造函数 public WifiAutoConnectManager(WifiManager wifiManager) { this.wifiManager = wifiManager; } // 提供一个外部接口,传入要连接的无线网 public void connect(String ssid, String password, WifiCipherType type) { Thread thread = new Thread(new ConnectRunnable(ssid, password, type)); thread.start(); } // 查看以前是否也配置过这个网络 private WifiConfiguration isExsits(String SSID) { List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals(""" + SSID + """)) { return existingConfig; } } return null; } private WifiConfiguration createWifiInfo(String SSID, String Password, WifiCipherType Type) { WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = """ + SSID + """; // nopass if (Type == WifiCipherType.WIFICIPHER_NOPASS) { config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; } // wep if (Type == WifiCipherType.WIFICIPHER_WEP) { if (!TextUtils.isEmpty(Password)) { if (isHexWepKey(Password)) { config.wepKeys[0] = Password; } else { config.wepKeys[0] = """ + Password + """; } } config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN); config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED); config.allowedKeyManagement.set(KeyMgmt.NONE); config.wepTxKeyIndex = 0; } // wpa if (Type == WifiCipherType.WIFICIPHER_WPA) { config.preSharedKey = """ + Password + """; config.hiddenSSID = true; config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); // 此处需要修改否则不能自动重联 // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); config.status = WifiConfiguration.Status.ENABLED; } return config; } // 打开wifi功能 private boolean openWifi() { boolean bRet = true; if (!wifiManager.isWifiEnabled()) { bRet = wifiManager.setWifiEnabled(true); } return bRet; } class ConnectRunnable implements Runnable { private String ssid;private String password;private WifiCipherType type; public ConnectRunnable(String ssid, String password, WifiCipherType type) { this.ssid = ssid; this.password = password; this.type = type; } @Override public void run() { // 打开wifi openWifi(); // 开启wifi功能需要一段时间(我在手机上测试一般需要1-3秒左右),所以要等到wifi // 状态变成WIFI_STATE_ENABLED的时候才能执行下面的语句 while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) { try { // 为了避免程序一直while循环,让它睡个100毫秒检测…… Thread.sleep(100); } catch (InterruptedException ie) { } } WifiConfiguration wifiConfig = createWifiInfo(ssid, password, type); // if (wifiConfig == null) { Log.d(TAG, "wifiConfig is null!"); return; }WifiConfiguration tempConfig = isExsits(ssid); if (tempConfig != null) { wifiManager.removeNetwork(tempConfig.networkId); } int netID = wifiManager.addNetwork(wifiConfig); boolean enabled = wifiManager.enableNetwork(netID, true); Log.d(TAG, "enableNetwork status enable=" + enabled); boolean connected = wifiManager.reconnect(); Log.d(TAG, "enableNetwork connected=" + connected); } } private static boolean isHexWepKey(String wepKey) { final int len = wepKey.length(); // WEP-40, WEP-104, and some vendors using 256-bit WEP (WEP-232?) if (len != 10 && len != 26 && len != 58) { return false; } return isHex(wepKey); } private static boolean isHex(String key) { for (int i = key.length() - 1; i >= 0; i--) { final char c = key.charAt(i); if (!(c >= "0" && c <= "9" || c >= "A" && c <= "F" || c >= "a" && c <= "f")) { return false; } } return true; }}

android libusb 与android host usb api有什么区别

Android对USB的支持有两种模式: HOST模式:Android设备为USB总线和外设供电,数据传输是双向的。 Accessory模式:即附件模式,Android作为附件,手机和电脑连接,通常是这种模式,由USB Device端向总线供电,数据传输方向是双向的。可以看看安卓巴士的教程:http://www.apkbus.com/thread-465444-1-1.html

Android手机使用USB接口与RS232通讯

我来讲一下,手机支持USB host与否是与处理器有关的,现在的手机处理器好多是支持的。但关键来讲,要想实现USB与232通信需要一下硬件支持:USB转232芯片模块软件:操作系统有USB host驱动,有USB转232芯片驱动,有通信软件所以理论上可行,实际上是几乎不可能的。事实上,几乎百分百的手机处理器都带有电平方式的串口(可以理解为232),多数不止一组,只是驱动和通信软件是难题,还有,手机和GSM GPRS通信模块通信就是采用的串口方式,和GPS通信也是串口方式,具体可以百度或谷歌。以上,是准确说法

求助,Android4.0 USBHOSt不能用

以下可做参考:1.如果只是手机的USB硬件是OTG,支持USB Host 但是手机中android系统是低于3.1版本,或者里面没有对应的USB驱动的 则都无法使用USB Host功能,都无法外接USB 键盘之类的USB设备。 2。本身手机的USB硬件就不是OTG的,就不支持USB Host 即使你手机中Android版本再高,比如是4.1,那也是白搭,也没法用USB Host的。 3.只有当你的手机本身的USB硬件是OTG的,且Android系统是3.1版本之上的,且系统的固件(ROM镜像)里面是有对应的驱动的,才能真正使用上USB Host。

android usb host模式 中需要什么权限

:USB OTG功能如何打开及实现 USB OTG U盘 Keyboard Mouse 1、检查HW原理图,确认是否支持OTG功能(vbus是否供上电,IDDIG pin连接是否正确)

android手机怎么查看是否支持usb host

从android的文档上看,支持usb host需要android 3.1或者2.3.4,那么可以预计官方支持这些版本的手机应该都支持usb host,而非官方支持的情况未知。

请教Android环境下使用POI将PPT转成图片的问题

代码:SlideShow ppt = new SlideShow(is); //获取PPTPictureData[] pictures = ppt.getPictureData(); //图片信息(包括底图) 例如有两张图Slide[] slide = ppt.getSlides(); //幻灯片信息 例如有三张幻灯片for (int i = 0; i < slide.length; i++){ //循环读取每一张幻灯片 Shape[] sh = slide[i].getShapes(); //获取每一页元素 for (int j = 0; j < sh.length; j++){ //循环读取每一页的每一个元素信息 if (sh[j] instanceof AutoShape){ AutoShape shape = (AutoShape)sh[j]; ... }else if(sh[j] instanceof Picture){ Picture picture = (Picture)sh[j] ... } //发现picture无法读取到底图 只能读取到压到每一页的元素} 在这里第一张和第三张PPT有底图信息 第二张只有文字信息请问: 在pictuerdata 里面获取的图片信息怎么判断是属于哪一页的

Android方面如何将ppt转为图片然后实现ppt预览的效果

我也遇到同样的问题 请问解决了吗?如果解决了 麻烦告诉我方法 谢谢喽

android状态栏高度是多少

这个是可以自定义的,你的需求是什么,一般的是77dp

Android 关于"尺寸"的那些事(dp,dip,sp,pt,px...)

屏幕大小:屏幕大小是手机对角线的物理尺寸,以英寸inch为单位。比如我的Mix 2手机屏幕大小为5.99 inches,意味着我的屏幕对角线长度为5.99inches = 5.99 * 2.54 = 15.2146cm 分辨率:屏幕的像素点数,一般表示为a*b。例如某手机分辨率为21601080,意味着手机屏幕的竖直方向(长)有2160个像素点,水平方向(宽)有1080个像素点。 px :Pixels ,像素;对应屏幕上的实际像素,是画面中最小的点(单位色块),像素大小没有固定长度值,不同设备上1个单位像素色块大小不同。 这么说可能有点陌生,用屏幕分辨率来说,今年流行起来的“全面屏”分辨率是 2160*1080,但是你也可以发现,虽然很多全面屏手机分辨率一样,但是明显看得出来屏幕大小不一样,这也解释了“不同设备像素色块大小是不同的”。 pt :1pt=1/72 inch,用于印刷业,非常简单易用; dpi :Dots Per Inch,每英寸点数;详见ppi ppi :Pixels Per Inch,每英寸像素数;数值越大显示越细腻。计算式:ppi = 屏幕对角线像素数 / 屏幕对角线长度。 还是举全面屏的例子,分辨率2160*1080,屏幕大小是5.9inches,勾股定理可以得到对角线像素数大约是2415,那么ppi = 2415 / 5.99 = 403. 事实上dpi 和 ppi 一定程度上可以划等号,都表示像素密度,计算方式完全一致,只不过使用场景不一样。dpi中的dots点属于打印或印刷等领域,例如drawable 文件对应的就是dpi,而ppi中的pixel属于屏幕显示等领域 dp/dip : Density-independent Pixels,密度无关像素 - 基于屏幕物理密度的抽象单位。1dp等于 160 dpi 屏幕上的dpx,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单:px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。 如果看完文章还是觉得很懵,那么可以直接记住: 1dp单位在设备屏幕上总是等于1/160 inch。 sp :Scale-independent Pixels ,与 dp 单位相似,也会根据用户的字体大小偏好进行缩放。 首先我们放上源码中对尺寸单位的转换 可以看到,输入值类型为dp时,返回 value * DisplayMetrics.density,到这里我们可能会发懵:嗯?不对啊,前面我们不是通过px 和 dp 的换算公式来计算的么,怎么这里就简简单单乘了一个DisplayMetrics.density?不要慌,我们先看看源码中对DisplayMetrics.density的介绍。 源码注释中说到“在160dpi的屏幕下,density的值为1,而在120dpi的屏幕下,density的值为0.75”,我们可以大胆的猜测一下,120dpi下的density=0.75的原因是120dpi * 1 /160dpi=0.75。实际上,也就是这么回事。我们下面会仔细的分析。 需要补充一下,通常意义上Android 屏幕的密度,指的是像素密度dpi/ppi,对应于源码中的DisplayMetrics.densityDpi。 为什么引入dp? Android 引入了dp这一单位,使得不论多大屏幕,多大dpi,显示的效果始终保持一致。 但是根据前面我们提到的px与dp的换算公式px = dp * (dpi / 160),很显然,由于相同分辨率但不同屏幕大小的设备dpi是不同的,导致px和dp的基本不存在一个固定的换算关系,为了方便屏幕适配,Android设置了6个通用的密度,换算px与dp时采取通用密度计算,而非设备实际的密度。 以下为6种通用密度,以及其最小的分辨率 得到上面通用密度之后,我们换算dp与px多了一种简便方式。前面我们提到Android将mdpi作为基准,此时1px = 1dp,又有px = dp * (dpi / 160),所以我们可以很容易的得到以下换算: 还记不记得前面源码中的density属性,实际上DisplayMetrics.density = dpi / 160 ,表示的就是在某个通用密度下dp与px的换算比(1dp/1px的值) 这部分其实和程序员自身已经关系不大了,毕竟参与工作之后这些都是UI人员的活儿了。不过鉴于现在我还只是一枚在校生,还是记下来以免自己遗漏吧。 建议在xhdpi中作图 原因嘛,首先现在主流分辨率是1080p,以及最近流行起来的全面屏18:9,而xhdpi对应720p,向低dpi兼容自然没问题,即便在xxhdpi中显示,也会有个不错的效果。而如果以1920*1080作图,显然图片素材占用的内存很大,而且也会增大应用安装包的大小。 只有一个原则:资源放入对应dpi的文件夹中,Android会机智的加载合适的资源。 以drawable资源为例: 我们平时开发小项目&对UI要求不高时,只使用一套xhdpi的资源就足够了,虽然这可能会导致在hdpi及以下的手机中有些卡顿,因为xhdpi的图片运行在hdpi及以下的手机上会比较吃内存,不过无伤大雅。 而如果不为图片资源犯愁时(有UI人员的支持,就是任性),就可以添加所有dpi的资源。当然,重点还是要满足ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12的规律。 好像说了不少废话,哈哈,大概就这么多吧。

在 android 中,在屏幕密度为160时,1pt 大概等于多少sp

在 Android 中, 1pt 大概等于 2.22sp以上供参考, 与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。 px(像素):屏幕上的点。 in(英寸):长度单位。 mm(毫米):长度单位。 pt(磅):1/72英寸。 dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。 dip:与dp相同,多用于android/ophone示例中。 sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。 分辨率:整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点。 density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。apk的资源包中, 当屏幕density=240时使用hdpi标签的资源 当屏幕density=160时,使用mdpi标签的资源 当屏幕density=120时,使用ldpi标签的资源。 一般android设置长度和宽度多用dip,设置字体大小多用sp. 在屏幕密度为160,1dp=1px=1dip, 1pt = 160/72 sp 1pt = 1/72 英寸.当屏幕密度为240时,1dp=1dip=1.5px.

android density是什么意思

屏幕密度

android Linux Deploy 挂载虚拟硬盘后无法卸载

fdisk -l 找移硬盘名 比/dev/sda0umount /dev/sda0mkdir /mnt/usbmount -t ext3 -w /dev/sda0 /mnt/usb挂装读写系统 ,示例自看着办

android backupmanagerservice可以去掉吗

有些案子机油因为不小心删除了系统自带的一些程序,使得手机出现很大的问题,只有重新刷机才可以解决。这份表单,供各位在删除程序的时候做个参考。Android手机系统中默认会自带很多无用程序,这些应用,平时很少用不到,但因为是系统自带的,所以它们像牛皮癣一样内嵌在手机里,无法去除。下面列举一些能够删除和不能够删除的软件列表,怎么删除呢?当然是下载一个Root Explorer来删除(需要完全ROOT) 注意: ①. 有*号是绝不可删的,否则会出现严重问题; ②. 删除系统自带程序前,请注意备份; ③. 因不同版本的Android系统和不同品牌手机的定制,会有差异导致系统自带程序列表有差异,但大体上一致,请大家自己斟酌。 【内容】 自带的软件列表: *AccountAndSyncSettings.apk 同步与帐户设定(绝不能删除) *ApplicationsProvider.apk 应用程序支持服务 (绝不能删除) Bluetooth.apk 蓝牙(删除后蓝牙功能消失) Browser.apk 系统自带浏览器(可用其他手机浏览器替代) Calculator.apk 计算器(可删,可用其他替代) Calendar.apk 日历(可删) CalendarProvider.apk 日历程序支持服务(可删) *Camera.apk 自带相机 (绝不能删除) *CertInstaller.apk 证书服务 (绝不能删除) Contacts.apk 通讯录/联系人(用第三方通讯录的可删)u2192 *Contactsrovider.apk 通讯录/联系人数据存储服务 (绝不能删除)u2192 *DefaultContainerService.apk 默认通讯录服务(绝不能删除)u2192 DeskClock.apk 自带闹钟(用第三方闹钟的可删)u2192- *DownloadProvider.apk 下载管理器(绝不能删除)u2192 *DrmProvider.apk DRM受保护数据存储服务(绝不能删除)u2192 DSPManager.apk DSP音频管理(可删)u2192 Email.apk Email(不用自带Email接受邮件的可删)u2192 FileManager.apk 简易文件管理器(可删,可用ES文件管理器替代)u2192 Gallery3D.apk 3D图片浏览器 (可删)u2192 GenieWidget.apk 天气与新闻(可删)u2192 Gmail.apk Gmail(可删)u2192 GoogleBackupTransport.apk ***(未知程序,可删)u2192 GoogleCalendarSyncAdapter.apk 存储日历信息(可删)u2192 GoogleContactsSyncAdapter.apk 存储联系人信息(可删)u2192 GoogleFeedback.apk ***(据说删除后开机会提示GoogleFeedback.apk,根据自身情况决定是否删除)u2192 GooglePartnerSetup.apk Google助手(可删)u2192. ] GooglePinyinIME.apk Google拼音(可删,用其他输入法替代)u2192 GoogleQuickSearchBox.apk 谷歌搜索(可删)u2192 GoogleServicesFramework.apk 同步支持服务(删除后无法同步联系人,且不能登录Google)u2192 HTMLViewer.apk HTML浏览器(可删)u2192 kickback.apk 辅助功能! LauncherPro.apk 原生桌面(可删)u2192 LiveWall**sPicker.apk 动态壁纸(可删)u2192 Maps.apk Google地图(可删)u21927 Z" } Market*r.apk 市场升级(不确定)u2192 *MediaProvider.apk 媒体数据存储服务(绝不能删除)u2192 MediaUploader.apk 媒体升级(可删)u2192 Mms.apk 自带信息(可删)u2192 ` Music.apk 自带音乐(可删,用自己喜欢的播放器吧)u2192 NetworkLocation.apk 网络位置(可删)u2192 OneTimeInitializer.apk ***(未知,可删)u2192 *PackageInstaller.apk 程序安装(绝不能删除)u2192 *Phone.apk 电话拨号程序(绝不能删除)u2192 PhoneGuard.apk 拨号卫士(可删)u2192 PicoTts.apk 可删(文字语言转换的语音合成引擎,设置-语音输入与输出中)u2192 Protips.apk 桌面小绿人插件(可删)u2192 *QuickMgr.apk 一键设置(长按menu的后弹出的那个,绝不能删除)u2192 *Settings.apk 系统设置(绝不能删除)u2192 *SettingsProvider.apk 设置服务程序 (绝不能删除)u2192 *SetupWizard.apk 开机引导(在定制Rom时不可删,刷好机可用Root Explorer删掉)u2192 SMSPopup.apk 短信泡泡(就是短信来时弹出的那个,其实就是个弹出框架)u2192 soundback.apk 辅助功能(可删)u2192 SoundRecorder.apk 录音机(可用第三方录音软件替代)u2192 Stk.apk SIM卡服务(可删,有机友把联系人复制在SIM卡上的就不要删它)u2192 Street.apk 街道(可删)u2192 *Superuser.apk 授权程序(就是程序列表上面那个,用这个来获取Root的)u2192 Talk.apk 系统服务项(可删)u2192 talkback.apk 辅助功能(可删)u2192 *TelephonyProvider.apk 拨号记录存储服务(绝不能删除)u2192 Term.apk 超级终端(可删,不过不建议,可以用来刷Recovery)u2192 TtsService.apk Text-to-speech服务(可删)u2192 *r.apk 在线升级(可删)u2192 UserDictionaryProvider.apk 用户数据字典服务(可删)u2192 Vending.apk 电子市场(可删)u2192 VoiceSearch.apk 语音搜索(可删)

android 系统中的彩蛋有何作用

自从Android 2.3 Gingerbread以来,每一代的Android系统都隐藏了一个彩蛋,不过打开的方法都是相同的。在新版系统中彩蛋的动画和与用户的互动也变得越来越复杂。今天教你如何打开安卓手机彩蛋。  Android系统的彩蛋包括nyan cat(彩虹猫)、Tron创战纪、僵尸和果冻豆等等。每个系统的菜单都与该系统的版本代号相呼应。如何开启彩蛋  想要开启你的Android设备的彩蛋是很简单的,只需打开设置->关于手机/平板,然后猛点系统版本栏(快速点击几次),彩蛋就会很快出现了。  找到系统设置->关于手机  猛点系统版本栏 Android 4.1 Jelly Bean  Android 4.1 Jelly Bean系统中的彩蛋是个巨大的红色果冻豆,用手指触摸它会出现一张笑脸。  Android 4.1 Jelly Bean系统彩蛋  长按果冻豆后一款互动式的迷你果冻豆游戏就会出现了。一大堆果冻豆会出现在屏幕上,你可以用手指去拨弄它们,除非电池耗尽否则游戏永远也不会结束。  Android 4.1 Jelly Bean系统彩蛋 Android 4.0 Ice Cream Sandwich  ICS系统的彩蛋是一个穿着冰淇淋三明治的像素化Android机器人。  Android 4.0 ICS系统彩蛋  长按这个机器人后,一大群穿着冰淇淋三明治的机器人将从屏幕上飞过。  Android 4.0 ICS系统彩蛋  这个彩蛋其实是在向一只名叫nyan cat(彩虹猫)的猫咪致敬。nyan cat是一款像素化的小游戏,一只小猫驾着彩虹在宇宙间飞行。所以Android 4.0系统的彩蛋也被称作“nyan droid”。Android 3.0 Honeycomb  Honeycomb的彩蛋灵感来源于其系统代号——honeybee(蜜蜂)。这只蜜蜂是电子风的蓝色色调,与Honeycomb系统的色调和界面风格相同。  Android 3.0 Honeycomb系统彩蛋  很多朋友可能也注意到了,Android 3.0的界面主题似乎与Tron: Legacy(创战纪)很相似,因此在Honeycomb的彩蛋中也包含了Tron的元素。如在蓝色蜜蜂下面弹出的气泡提示中的“REZZZZZZZ……”。Rezzing就是在Tron中创建东西的术语。Android 2.3 Gingerbread  Gingerbread系统的彩蛋是一个僵尸化的姜饼人,整个背景也是僵尸风格。不过这款菜单只会显示这些可怕的僵尸姜饼人,没有任何动画或互动功能。仔细看的话你会发现,每只僵尸都在用Android手机打电话。  Android 2.3 Gingerbread系统彩蛋

Android 平台最好用的 PDF 阅读器是什么?

手机版的wps就可以打开pdf,其它文档也可以打开

Android SDK 各版本之间有什么差异

版本越高,当然功能越好了,就如同win7 与dos的区别,且高版本可以兼容低版本的

android 代号是怎么样的?例如4.0就叫冰激凌三明治,其他呢?

Android 1.5:Cupcake(杯子蛋糕)Android 1.6:Donut(甜甜圈)Android 2.0 / 2.1:éclair(闪电泡芙)Android 2.2:Froyo(冷冻忧格)Android 2.3:Gingerbread(姜饼)Android 3.0:Honeycomb(蜂巢)Android 4.0:Ice Cream(冰淇淋)

android手机能下载unity web player吗?

不能的 目前貌似只能在PC上

Android 怎么样实现ashmem 详细03

anonymous/named mmap,其好处是提供了辅助内核内存回收算法的pin/unpin 机制。ashmme 的典型用法是先打开设备文件,然后做mmap 映射。第一步通过调用ashmem_create_region 函数,这个函数完成这几件事:java 代码:1. fd = open(“/dev/ashmem”, O_RDWR);2. ioctl(fd, ASHMEM_SET_NAME, region_name); // 这一步可选3. ioctl(fd, ASHMEM_SET_SIZE, region_size);复制代码第二步,应用程序一般会调用mmap 来把ashmem分配的空间映射到进程空间:mapAddr = mmap(NULL, pHdr->mapLength, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);可以说ashmem以较小的代价(用户需进行额外的ioctl 调用来设置名字,大小,pin 和unpin),获得了一些内存使用的智能性。ashmem本身实现也很小巧,只有不到700 行。原因是借助了内核已经有的工具,例如shmem_file_setup(支撑文件),cache_shrinker(slab 分配算法的页面回收的回调函数)等。如果ashmem不使用内核驱动实现,则pin/unpin 的语义比较难以实现,或者即使实现,效率也不会很高。但查询android 源码,使用pin/unpin 很少,看来ashmem还是没有很好地用起来。如果不使用ashmem驱动,并且舍弃pin/unpin 语义,那么模拟ashmem的语义还是很简单的。首先,ashmem_create_region 可以为进程创建一个唯一的文件(如进程名+时戳),打开,然后返回这个文件的fd;接着应用程序可以进性一般的mmap 操作了。如果不使用ashmem_create_region 接口函数,那么使用anonymous 的mmap 就可以了,但这种方式属于正在 被丢弃的方式,而且并不是所有的系统都支持,比如Macos 就不支持。

Android 内存管理原理

在Android开发中我们常常遇到app在后台长期不使用时被系统自动回收掉,Android系统是怎么实现这个功能的呢。我们不讨论如何让app保活的方法,主要来说说系统实现这一机制的原理 在Android系统中使用oom_adj值来描述一个进程的重要程度,它是AMS的Process类型中的一个变量,oom_adj值越小,表示进程越重要,越不容易被杀掉。以下是AMS中定义的一些oom_adj值 可以看到一些运行核心服务的进程的oom_adj为-12(CORE_SERVER_ADJ),这类进程基本不会被杀死。其他未赋值的都在static块中进行了初始化,是通过system/rootdir/init.rc进行配置的: 可以看到前台进程的oom_adj值为0,这类进程时我们正在交互的进程,基本也不会被杀掉;空进程对应的值是15,当系统内存不足是最新杀掉的就是这类进程(这类进程一般指的是所有的activity都destory掉了,并且没有service在运行)。adj值下面描述的是各种内存阀值。比如当系统剩余内存小于6144 * 4kb(ro.EMPTY_APP_MEM)是emty 进程就会被回收掉。这些值对与每个手机厂商生产的手机都是不一样的。以下是oom_adj值对应的内存阀值 如上所说,当系统内存小于6144 * 4kb时empty进程将会被回收掉,而empty进程的oom_adj值为15。在Activity、service、contentProvider、Broadcast Android四大组件的状态的变化都会导致AMS更新对应进程oom_adj值,所以前台进程比后台进程更不容易杀掉,带有service的后台进程比没有service的进程更不容易被杀掉 LMK的全称是low memory killer,它是内核的一个模块。它里面保存了各个进程的pid以及对应的oom_adj,每次AMS调用updateOOmAdj函数更新进程的oom_adj时都会通知LMK模块。 LMK通过linux的shrinker模块来监听系统的内存变化,当系统的剩余内存达到某个阀值时就会杀掉oom_adj值大于这个阀值对应的oom_adj的进程。它会优先杀掉内存占用多的进程,如果杀掉这些进程内存回到了正常值将不会继续杀进程。所以让app不要占用大量的内存也可以起到保活的作用

android h5 混合开发的应用软件有哪些

一、Adobe Edge  目前还处于预览阶段的Adobe Edge是用HTML5、CSS、JavaScript开发动态互动内容的设计工具。内容可以同时兼容移动设备和桌面电脑。Edge的一个重要功能是Web工具包界面,方便确保页面在不同浏览器中的架构一致性,此外Edge还将整合TypeKit这样的字体服务。  动画和图形可以添加到HTML元素中,程序也能通过Edge自身的代码片段库或者JavaScript代码进行扩展。动画可以在独立的时间线上进行嵌套,还能实现互动功能。符合可以服用并通过API和代码片段控制。通过Edge设计的内容可以兼容iOS和Android设备,也可以运行在火狐、Chrome、Safari和IE9等主流浏览器。  二、Adobe Dreamweaver CS6  Adobe Dreamweaver CS6作为一个Web设计软件,提供了对HTML网站和移动程序的可视化编辑界面。其Fluid Grid排版系统整合CSS样式表功能,提供自适应版面的跨平台兼容性。开发者可以完全实现Web设计的可视化操作,无需为代码所困。  用户不但还能在Live View中预览,还提供多屏幕预览功能。开发者可以通过MultiScreen预览面板查看HTML5内容的渲染效果。Live View通过WebKit渲染引擎支持HTML5。  三、Adobe ColdFusion 10  ColdFusion是用来开发企业Web程序的服务器端技术,通过Websockets、互动表单、视频和地理标签等HTML5技术创建富媒体用户体验。  四、Sencha Architect 2  在开发移动和桌面应用的工具中,Sencha的定位是HTML5可视化应用开发。开发团队可以在一个单一集成的环境中完成应用的设计、开发和部署。开发者还可以开发Sencha Touch2和Ext JS4 JavaScript应用,并实时预览。  五、Sencha Touch 2  Sencha Touch2是移动应用框架,也被看作是Sencha的HTML5平台。开发者可以用它开发面向iOS、Android和Blackberry、Kindle Fire等多种平台的移动应用。  六、Dojo Foundation Maqetta  来自于IBM的一个项目,Dojo Foundation Maqetta是为桌面和移动设备开发HTML5应用的开源工具,支持在浏览器中查看HTML5界面。用户体验设计师可以通过拖放组装UI样板  七、微软Visual Studio 2010 ServicePack 1  虽然一开始并不支持HTML5,但微软在2011年三月发布的Visual Studio 2010 SP1中提供了IntelliSense,追加了针对HTML5的一些元素。  八、JetBrains WebStorm 4.0  作为拥有HTML编辑器的JavaScript集成开发环境,WebStorm4.0提供了开发web应用的HTML5样板。开发者可以在创建HTML文档时可获得对HTML5文件的支持。例如砍伐者键入。开发者还可以在chrome浏览器中实时预览HTML文档。  九、Google Web Toolkit  该开发工具用于开发浏览器应用,但库中支持很多HTML5功能。包括对客户端或web存储的支持。其他HTML5功能还包括支持Canvas可视化,以及音频和视频widget。  十、DCloud HBuilder  HBuilder是当前最快的HTML开发工具,强大的代码助手帮你快速完成开发,最全的语法库和浏览器兼容性数据让浏览器碎片化不再头痛。

android app自动化测试工具有哪些

1、Monkey是SDK自带的测试工具,在中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行,也有日志输出。实际上该工具只能做程序做一些,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。2、MonkeyRunner也是SDK提供的测试工具。严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写来自定义数据、事件。缺点是脚本用Python来写,对测试人员来说要求较高,有比较大的学习成本。3、Instrumentation是早期Google提供的自动化测试工具类,虽然在那时候JUnit也可以对Android进行测试,但是Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件。Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,不能跨多个App。4、UiAutomator也是Android提供的,基本上支持所有的Android事件操作,对比Instrumentation它不需要测试人员了解代码实现细节(可以用UiAutomatorviewer抓去App页面上的控件属性而不看源码)。基于Java,测试代码结构简单、编写容易、学习成本,一次编译,所有设备或模拟器都能运行测试,能跨App(比如:很多App有选择相册、打开相机拍照,这就是跨App测试)。缺点是只支持SDK 16(Android )及以上,不支持Hybird App、WebApp。5、Espresso是Google的开源。相对于Robotium和UIAutomator,它的特点是规模更小、更简洁,API更加精确,编写测试代码简单,容易快速上手。因为是基于Instrumentation的,所以不能跨App。配合Android Studio来编写测试的简单例子6、Selendroid:也是基于Instrumentation的测试框架,可以测试Native App、Hybird App、Web App,但是网上资料较少,社区也不大。7、Robotium也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。8、Athrun是淘宝出的一个移动测试框架/平台,同时支持iOS和Android。Android部分也是基于Instrumentation,在Android原有的ActivityInstrumentationTestCase2类基础上进行了扩展,提供一整套的API。这里有详细介绍。9、Appium是最近比较热门的框架,社区也很活跃。这个框架应该是是功能最强大的,

Android 手机自动化测试工具有哪几种

Feb 23 2012更新: 还有Sikuli (http://sikuli.org),基于优秀的图像对比库opencv的测试工具,测试脚本使用Python编写,非常强大。如果你的app没有源码,可以选择它;或者你想做系统测试(跨app的测试),也可以选择它。其它的还是用下面说的那些个吧。我通过其核心包sikuli-script.jar实现了android的sikuli化,暂时不打算开源。其实原理挺简单的,认真看过sikuli源码的应该都能写出来。看lz的意思应该只是想问应用层的,我来说点应用层的 先说说开源的吧:RobotiumMonkeyrunnerRobolectricCTS还有个新兴的测试工具,以前在GitHub看到,现在找不到了,好像是BDD类型的语法;现在还不成熟。 另外基于web的测试也有基于Selenium Webdriver 的 Android WebDriver: 有两种:基于Remote Server的:官方提供了java接口的,但是Python版的官方里面却没有。我非常喜欢Python,所以自己实现了并且开源到了GitHub:https://github.com/truebit/AndroidWebDriver4Python 有问题大家可以提到上面 基于Instrumentation的:已经在Android SDK r14里面可以安装了不开源的就多了,不过我见过的一般是以下几种思路: 1. 基于Android Java Instrumentation框架:基于Robotium,比如bitbar的产品:http://bitbar.com/products基于Instrumentation,那就海了去了,很多公司自家写的工具都基于这个;另外Robotium就是基于这个的2. 基于Android lib层的各种命令,比如sendevent,getevent, monkey, service这些,然后用各种语言封装 MonkeyRunner还是很有前景的,Google自己弄的。现在最新的dev版本已经有支持UI的id操作的EasyMonkey了。可以git clone git://http://android.kernel.org/platform/sdk.git看看编辑于 2012-02-23 7 条评论 u2022 作者保留权利赞同23反对,不会显示你的姓名乙醇,打杂的......落小雪、蒋金龙、Reeta L 等人赞同appium是最近我关注的一个不错的移动端自动化测试工具,支持android和ios。放上两段视频。第一段是讲解appium的原理及quick start;第二段讲解了appium的源码结构和具体实现。有兴趣可以看一下,相信应该有收获。1,appium 原理与quick start乙醇的appium视频教程之appium入门及原理剖析http://v.youku.com/v_show/id_XNjQzMjI4NDcy.html?firsttime=22122,appium源码解析乙醇的appium源码解读http://v.youku.com/v_show/id_XNjQzODIwMzA4.html?firsttime=0发布于 2013-12-07 5 条评论 u2022 作者保留权利赞同25反对,不会显示你的姓名知乎用户,Coding/Reading/Hiking/Running知乎用户、曹媛媛、石存沣 等人赞同1、Monkey是Android SDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。2、MonkeyRunner也是Android SDK提供的测试工具。严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写测试脚本来自定义数据、事件。缺点是脚本用Python来写,对测试人员来说要求较高,有比较大的学习成本。3、Instrumentation是早期Google提供的Android自动化测试工具类,虽然在那时候JUnit也可以对Android进行测试,但是Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件。Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,不能跨多个App。4、UiAutomator也是Android提供的自动化测试框架,基本上支持所有的Android事件操作,对比Instrumentation它不需要测试人员了解代码实现细节(可以用UiAutomatorviewer抓去App页面上的控件属性而不看源码)。基于Java,测试代码结构简单、编写容易、学习成本,一次编译,所有设备或模拟器都能运行测试,能跨App(比如:很多App有选择相册、打开相机拍照,这就是跨App测试)。缺点是只支持SDK 16(Android 4.1)及以上,不支持Hybird App、WebApp。5、Espresso是Google的开源自动化测试框架。相对于Robotium和UIAutomator,它的特点是规模更小、更简洁,API更加精确,编写测试代码简单,容易快速上手。因为是基于Instrumentation的,所以不能跨App。配合Android Studio来编写测试的简单例子6、Selendroid:也是基于Instrumentation的测试框架,可以测试Native App、Hybird App、Web App,但是网上资料较少,社区活跃度也不大。7、Robotium也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。8、Athrun是淘宝出的一个移动测试框架/平台,同时支持iOS和Android。Android部分也是基于Instrumentation,在Android原有的ActivityInstrumentationTestCase2类基础上进行了扩展,提供一整套面向对象的API。这里有详细介绍。9、Appium是最近比较热门的框架,社区也很活跃。这个框架应该是是功能最强大的,它的优点:它的哲理是:它的设计理念:相关限制:总结:在iOS部分是封装了UIAutomation;Android 4.2以上是用UiAutomator,Android 2.3 ~ 4.1用的是 Instrumentation,也就说Appium同时封装了UiAutomator和Instrumentation。所以Appium拥有了以上几大框架的所有优点:跨App,支持Native App、Hybird App、Web App,还支持N种语言来编写你的测试脚本。如果你在Windows使用Appium,你没法使用预编译专用于OS X的.app文件,因为Appium依赖OS X专用的库来支持iOS测试,所以在Windows平台你不能测试iOS Apps。这意味着你只能通过在Mac上来运行iOS测试。Client/Server架构,运行的时候Server端会监听Client端发过来的命令,翻译这些命令发送给移动设备或模拟器,然后移动设备或模拟器做出响应的反应。正是因为这种架构,所以Client可以使用Appium client libraries多种语言的测试脚本,而且Server端完全可以部署在服务器上,甚至云服务器。Session,每个Client连接到Server以后都会有一个Session ID,而且Client发送命令到Server端都需要这个Session ID,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。所以你甚至可以打开N个Session,同时测试不同的设备或模拟器。Desired Capabilities,其实就是一个键值对,设置一些测试的相关信息来告诉Server端,我们需要测试iOS、还是Android,或者换是WebApp等信息。Appium Server是Node.js写的,所以可以直接用NPM来进行安装。Appium Clients,Mac OS和Win下提供GUI,不需要装Node.js,方便测试人员操作。用Appium自动化测试不需要重新编译App;支持很多语言来编写测试脚本,Java、Javascript、PHP、Python、C#、Ruby等主流语言;不需要为了自动化测试来重造轮子,因为扩展了WebDriver。(WebDriver是测试WebApps的一种简单、快速的自动化测试框架,所以有Web自动化测试经验的测试人员可以直接上手);移动端自动化测试应该是开源的;开源;支持Native App、Hybird App、Web App;支持Android、iOS、Firefox OS;Server也是跨平台的,你可以使用Mac OS X、Windows或者Linux;显示全部编辑于 2015-03-20 1 条评论 u2022 作者保留权利赞同4反对,不会显示你的姓名知乎用户,hello rabbit郝思远、man Nor、徐佳琦 等人赞同当前有很大的趋势是转向移动应用平台,Android 是最广泛使用的移动操作系统,2014 年大约占 80% 以上的市场。在开发 Android 应用的时候要进行测试,现在市场上有大量的测试工具。本文提到的开源 Android 软件测试工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。Android Test KitAndroid Test Kit 是一组 Google 开源测试工具,用于 Android 平台,包含 Espresso API 可用于编写简洁可靠的 Android UI 测试。OSChina URL: Android Test Kit首页、文档和下载相关资源* Android application testing with the Android test framework – Tutorial* Espresso for Android is here!AndroidJUnit4AndroidJUnit4 是一个让 JUnit 4 可以直接运行在 Android 设备上的开源命令行工具。OSChina URL: AndroidJUnit4首页、文档和下载AppiumAppium 是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android 和 FirefoxOS 平台。Appium 驱动苹果的 UIAutomation 库和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 协议。Appinm 的 iOS 支持是基于 Dan Cuellar"s 的 iOS Auto. Appium 同时绑定了 Selendroid 用于老的 Android 平台测试。OSChina URL: Appium首页、文档和下载相关资源* Appium Tutorial* Android UI testing with AppiumCalabash-androidcalabash-android 是一个基于 Cucumber 的 Android 的功能自动化测试框架。Calabash 允许你写和执行,是开源的自动化移动应用测试工具,支持 Android 和 iOS 原生应用。Calabash 的库允许原生和混合应用的交互测试,交互包括大量的终端用户活动。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 应用和桌面环境的交互跟触摸屏应用的交互是不同的。Calabash 专为触摸屏设备的原生应用提供 APIs。OSChina URL: calabash-android首页、文档和下载相关资源* A better way to test Android applications using Calabash* Calabash Android: query language basicsMonkeyMonkey 是 Google 开发的 UI/应用测试工具,也是命令行工具,主要针对压力测试。你可以在任意的模拟器示例或者设备上运行。Monkey 发送一个用户事件的 pseudo-random 流给系统,作为你开发应用的压力测试。OSChina URL: UI/Application Exerciser MonkeyMonkeyTalkMonkeyTalk 是世界上最强大的移动应用测试工具。MonkeyTalk 自动为 iOS 和 Android 应用进行真实的,功能性交互测试。MonkeyTalk 提供简单的 "smoke tests",复杂数据驱动的测试套件。MonkeyTalk 支持原生,移动和混合应用,真实设备或者模拟器。MonkeyTalk 使得场景捕获非常容易,可以记录高级别,可读的测试脚本。同样的命令可以用在 iOS 和 Android 应用上。你可以记录一个平台的一个测试,并且可以在另外一个平台回放。MonkeyTalk 支持移动触摸和基于手势交互为主的移动体验。点击,拖拽,移动,甚至是手指绘制也可以被记录和回放。OSChina URL: MonkeyTalk首页、文档和下载相关资源* Using MonkeyTalk in AndroidStudioNativeDriverNativeDriver 是 WebDriver API 的实现,是原生应用 UI 驱动,而不是 web 应用。OSChina URL: NativeDriver首页、文档和下载RobolectricRobolectric 是一款Android单元测试框架,使用 Android SDK jar,所以你可以使用测试驱动开发 Android 应用。测试只需几秒就可以在工作站的 JVM 运行。Robolectric 处理视图缩放,资源加载和大量 Android 设备原生的 C 代码实现。Robolectric 允许你做大部分真实设备上可以做的事情,可以在工作站中运行,也可以在常规的 JVM 持续集成环境运行,不需要通过模拟器。OSChina URL: Robolectric首页、文档和下载Additional resources* Better Android Testing with Robolectric 2.0Using Robolectric for Android testing – TutorialRoboSpockRoboSpock 是一个开源的 Android 测试框架。提供简单的编写 BDD 行为驱动开发规范的方法,使用Groovy 语音,支持 Google Guice 库。RoboSpock 合并了 Robolectric 和 Spock 的功能。OSChina URL: RoboSpock首页、文档和下载相关资源* RoboSpock – Behavior Driven Development (BDD) for AndroidRobotiumRobotium 是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长 按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测 试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。OSChina URL: Robotium首页、文档和下载相关资源* Robotium – Testing Android User Interface* Android user interface testing with Robotium – TutorialUIAutomatoruiautomator 测试框架提高用户界面(UI)的测试效率,通过自动创建功能 UI 测试示例,可以在一个或者多个设备上运行你的应用。OSChina URL: uiautomator首页、文档和下载相关资源* Automatic Android Testing with UiAutomatorSelendroidSelendroid 是一个 Android 原生应用的 UI 自动化测试框架。测试使用 Selenium 2 客户端 API 编写。Selendroid 可以在模拟器和实际设备上使用,也可以集成网格节点作为缩放和并行测试。OSChina URL: Selendroid首页、文档和下载相关资源* Mobile Test Automation with Selendroid* Road to setup Selendroid and create first test script of android application* Up and running with: Selendroid一些停止维护的 Android 测试工具一些几乎没有继续维护的开源 Android 测试工具项目(至少是最近几个月都没有更新的项目)。EmmageeEmmagee 是监控指定被测应用在使用过程中占用机器的CPU、内存、流量资源的性能测试小工具。Emmagee 同时还提供非常酷的一些特性,比如定制间隔来收集数据,使用浮动窗口呈现实时进程状态等。OSChina URL: Emmagee首页、文档和下载SiroccoScirocco(scirocco-webdriver) 是开源的应用自动化测试工具,可以从 Eclipse 访问必要的测试设备。Scirocco 提供自动化的 Android 应用测试功能,代替手工测试。Scirocco 支持谷歌的 NativeDriver,把 AndroidDriver 作为主要的测试库。Scirocco 包括三个部分:NativeDriver,AndroidDriver,scirocco 插件(一个 Eclipse 插件;可以自动执行 scenario 测试和制作测试报告截图)。OSChina URL: Scirocco首页、文档和下载via softwaretestingmagazine

如何利用jenkins来做android自动化

启动Jenkins1、 安装jdk从略,建议1.6或以上版本,配置好环境变量。2、 安装tomcat从略,安装完调试下tomcat是否正常。3、 安装ant下载zip包,解压后配置好环境变量。4、 安装jenkins下载war包,命名为Jenkins,拷贝到tomcat/webapps目录下。5、 安装Android SDK下载安装,完成后配置好Android_SDK_HOME环境变量。此步骤主要用于进行android自动化测试,若不进行此项可略过。安装完成后启动tomcat/bin/startup.bat文件(linux下是startup.sh),在浏览器输入http://localhost:8080/jenkins,8080为tomcat端口,即可访问jenkins服务器。配置Jenkins1、 JDK配置新增JDK,指定JDK名字和JAVA_HOME2、 ANT配置新增ANT,指定ANT名字和ANT_HOME3、 Maven配置从略,本文未使用到Maven,具体配置方法参考Google。4、 Subversion选择1.6版本SVN,勾选Update default Subversion credentials cache after successful authentication5、 邮件通知填写SMTP server、Default user E-mail suffix、System Admin E-mail Address、Jenkins URL、勾选Use SMTP Authentication,填写User Name、Password、Use SSL、SMTP port、Chareset(UTF-8) 、Default Content Type(默认)、Default Recipients(默认收件人),配置完成后可进行测试邮件。6、 Jenkins URL配置该URL,用于别人访问。插件管理1、 Hudson Subversion Plug-in,jenkins的svn插件。2、 Android Emulator Plugin,android模拟器插件。3、 JUnit Attachments Plugin,junit测试报告附件插件。4、 Email-ext plugin,邮件扩展插件。此处说明下,默认Jenkins只会发送构建失败的邮件,我们需安装此插件才能自定义不同场景。5、 Deploy to container Plugin远程发布插件。自动化测试打包源工程Android程序本小节讲诉如何打包一个Android工程,当前使用的是ant进行编译源码。1、 首先构建一个自由风格的Job。2、 添加源码路径,选择所使用的版本控制器,输入源码路径。3、 构建触发器可根据需要选择是否定时构建。4、 构建环境,此处Jenkins安装了Android Emulator Plugin插件,可以启动已有模拟器或添加新的模拟器,本文案例中使用真机调试。5、 构建,卸载手机中原程序 adb –s uninstall com.XXXXXX6、 生成bulid.xml文件,-p后面跟工程所在的本地jenkins下路径android update project -n *** c:被测工程Job路径workspace7、 Ant进行编译程序,并安装到当前手机中ant debug install -f c:被测工程Job路径workspaceuild.xml8、 构建后操作,本案例中构建完成后自动启动构建下一个测试JobBulid other projects,选择测试工程的Job.打包测试工程Android程序本小节讲诉如何构建一个Android测试工程,包括邮件发送和测试报告展示。1、 构建步骤1-7和Android程序章节一样,从略。2、 本文案例中测试程序是通过命令行启动运行的,所以在此处增加一个批处理运行。P.S. adb shell am instrument -w -e class com.megafon.test.MegafonTest#testDeleteContact com.megafon.test/android.test.InstrumentationTestRunner ,此处是通过批处理来单独运行一个个的测试用例。避免了Junit3的无序执行的问题。3、 删除Workspace中原来存在的测试报告文件,一般不删除也会覆盖。如何让测试程序生成xml格式的测试报告,其他文章会重点介绍。4、 从手机中拷贝测试报告,最终测试是在手机上运行,所以报告也生成在手机中,使用adb pull命令把测试报告全部拷贝到workspace下制定目录。5、 构建后操作,发布测试报告,如果报告中包含附件,此处使用到JUnit Attachments Plugin插件。6、 邮件通知,此处使用到Email-ext plugin插件,前面的默认,直接使用我们在系统管理里面设置的默认值。7、 点击右下角高级按钮,可选择不同场景下发送邮件。8、 测试结果展示,在本次构建的控制台可以显示当前所有的构建日志。9、测试报告点击Test Result可以显示所有测试记录。

如何debug android cts

启动和关闭ADB服务(adb start-server和adbkill-server)经作者测试,模拟器在运行一段时间后,adb服务有可能(在Windows进程中可以找到这个服务,该服务用来为模拟器或通过USB数据线连接的真机服务)会出现异常。这时需要重新对adb服务关闭和重启。当然,重启Eclipse可能会解决问题,但那比较麻烦。如果想手工关闭adb服务,可以使用如下命令:1. adb kill-server 在关闭adb服务后,要使用如下命令启动adb服务:1. adb start-server 链接DLNA网络的命令:ifconfig eth0 down; ifconfig eth0 hw ether 00:00:00:00:fd:87; ifconfig eth0 up; udhcpc下面的方法是更适合RD 来debug CTS issue的cts运行方式, 这样解决了一个大问题: 如果用android传统方式去运行cts的话,必然已经被cts 运行环境占用了adb端口,用eclipsedebug就无法在另外一台机器上进行(例如RDPC, eclipse debug也需要adb ), 唯一的方式, 就是把android的source code搬到cts 运行的ubuntu机器上, 由于size特别大,非常不便. 下面介绍的运行方式, 直接用adb 去模拟 cts环境的运行方式, 唯一的缺点是, 一个test一个test 的运行. 但是, 对RD来说,这反而是优点! 方便快捷. 这个方法概括一下就是: 在我们的branch 上就有cts 的sourcecode, 我们可以修改其中某个test case所对应的 apk source, 之后,build 出 apk, 然后安装到板子上去run. 如果我们修改的testcase apk,就是添加了一些message/log之类的, 就立即可以在运行过程中体现出来. 同时,我们可以利用eclipse/ddms相结合 debug android framework部分, 当然, 由于我们也有apk的sourcecode, 也可以debug test case apk本身. 请参考:刚做完实验 , 写下 SOP 给各位参考…之後若有 RD 需要, 也可以参考这份…. Steps:1)cmd> cd android/ics-4.x (到 android 目录)2)cmd>make cts Q) 如何知道0801的cts 版本 ?A)cmd> catandroid/ics-4.x/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildProvider.java| grepCTS_BUILD_VERSION Result:public static final String CTS_BUILD_VERSION = "4.0.3_r2"; 3)cmd>cd out/host/linux-x86/cts/android-cts/repository/testcases4)找到需要测试的apk 并copy 到PC端file folder Ex: CtsTestStubs.apk, CtsOsTestCases.apk, android.core.tests.runner.apk, CtsMyExampleTestCases.apk 5)确定PC 可用adb 连到target6)cmd>adbinstall CtsMyExampleTestCases.apk (安装需要测试的 apk)cmd>adb install CtsTestStubs.apk (这是google大多原生testapk 需要用到的 stub)cmd>adbinstall CtsOsTestCases.apkcmd>adbinstall android.core.tests.runner.apk7)cmd>adb shell pm list instrumentation (用来查看已经安装的instrumentation, 每个 CTS 用测的 apk 都是用instrumentation)Result:Instrumentation:com.android.cts.myexample/android.test.InstrumentationTestRunner (target=com.android.cts.myexample)8)整个 package 测试cmd>adbshell am instrument –w –r com.android.cts.myexample/android.test.InstrumentationTest(执行该 test package)此时可查看 failed (如下:Step8 test result example),也可透过 logcat log来看 fail (如下:[test result from logcat]) 单一class测试 cmd> adb shellam instrument –e classandroid.myexample.cts.MySampleCalculatorTest–w –rcom.android.cts.myexample/android.test.InstrumentationTestRunner cmd> adb shellam instrument –e classandroid.os.cts.MyHelloTest–w –rcom.android.cts.os/android.test.InstrumentationCtsTestRunner单一function测试 cmd> adbshell am instrument –e classandroid.myexample.cts.MySampleCalculatorTest#testAdd–w –rcom.android.cts.myexample/android.test.InstrumentationTestRunner 9) 移除测试用 apk (cmd: adb uninstall<app_name> à <app_name>可从 target 端查询: ls /data/app )cmd> adb uninstall com.android.cts.oscmd> adb uninstall com.android.cts.stubcmd> adb uninstall com.android.cts.myexample === [Step8: test result example] ===INSTRUMENTATION_STATUS:id=InstrumentationTestRunnerINSTRUMENTATION_STATUS: current=1INSTRUMENTATION_STATUS:class=android.myexample.cts.MySampleCalculatorTestINSTRUMENTATION_STATUS: stream=android.myexample.cts.MySampleCalculatorTest:INSTRUMENTATION_STATUS: numtests=2INSTRUMENTATION_STATUS: test=testAddINSTRUMENTATION_STATUS_CODE: 1INSTRUMENTATION_STATUS:id=InstrumentationTestRunnerINSTRUMENTATION_STATUS: current=1INSTRUMENTATION_STATUS:class=android.myexample.cts.MySampleCalculatorTestINSTRUMENTATION_STATUS: stream=.INSTRUMENTATION_STATUS: numtests=2INSTRUMENTATION_STATUS: test=testAddINSTRUMENTATION_STATUS_CODE: 0INSTRUMENTATION_STATUS:id=InstrumentationTestRunnerINSTRUMENTATION_STATUS: current=2INSTRUMENTATION_STATUS: class=android.myexample.cts.MySampleCalculatorTestINSTRUMENTATION_STATUS: stream=INSTRUMENTATION_STATUS: numtests=2INSTRUMENTATION_STATUS:test=testSubtrationINSTRUMENTATION_STATUS_CODE: 1INSTRUMENTATION_STATUS:id=InstrumentationTestRunnerINSTRUMENTATION_STATUS: current=2INSTRUMENTATION_STATUS:class=android.myexample.cts.MySampleCalculatorTestINSTRUMENTATION_STATUS: stream=Failure in testSubtration:junit.framework.AssertionFailedError:expected:<20> but was:<30> atandroid.myexample.cts.MySampleCalculatorTest.testSubtration(MySampleCalculatorTest.java:63) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) INSTRUMENTATION_STATUS:numtests=2 INSTRUMENTATION_STATUS:stack=junit.framework.AssertionFailedError: expected:<20> but was:<30> at android.myexample.cts.MySampleCalculatorTest.testSubtration(MySampleCalculatorTest.java:63) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) INSTRUMENTATION_STATUS:test=testSubtrationINSTRUMENTATION_STATUS_CODE: -2INSTRUMENTATION_RESULT: stream=Test results forInstrumentationTestRunner=..FTime: 0.079 FAILURES!!!Tests run: 2, Failures: 1, Errors: 0 INSTRUMENTATION_CODE: -1 ===[test result from logcat] ==== /ethernet(6210): Loading ethernet jni classD/AndroidRuntime(6210): Calling main entry com.android.commands.am.AmI/ActivityManager(1143): Force stopping package com.android.cts.myexample uid=10036I/ActivityManager(1143): Start proc com.android.cts.myexample for added applicationcom.android.cts.myexample: pid=6220 uid=10036 gids={}I/TestRunner(6220): started: testAdd(android.myexample.cts.MySampleCalculatorTest)I/TestRunner(6220): finished: testAdd(android.myexample.cts.MySampleCalculatorTest)I/TestRunner(6220): passed: testAdd(android.myexample.cts.MySampleCalculatorTest)I/TestRunner(6220): started: testSubtration(android.myexample.cts.MySampleCalculatorTest)I/TestRunner(6220): failed: testSubtration(android.myexample.cts.MySampleCalculatorTest)I/TestRunner(6220): ----- begin exception -----I/TestRunner(6220):I/TestRunner(6220): junit.framework.AssertionFailedError: expected:<20> butwas:<30>I/TestRunner(6220): at junit.framework.Assert.fail(Assert.java:47)I/TestRunner(6220): atjunit.framework.Assert.failNotEquals(Assert.java:282)I/TestRunner(6220): at junit.framework.Assert.assertEquals(Assert.java:64)I/TestRunner(6220): atjunit.framework.Assert.assertEquals(Assert.java:201)I/TestRunner(6220): atjunit.framework.Assert.assertEquals(Assert.java:207)I/TestRunner(6220): at android.myexample.cts.MySampleCalculatorTest.testSubtration(MySampleCalculatorTest.java:63)I/TestRunner(6220): at java.lang.reflect.Method.invokeNative(NativeMethod)I/TestRunner(6220): at java.lang.reflect.Method.invoke(Method.java:511)I/TestRunner(6220): at junit.framework.TestCase.runTest(TestCase.java:154)I/TestRunner(6220): at junit.framework.TestCase.runBare(TestCase.java:127)I/TestRunner(6220): atjunit.framework.TestResult$1.protect(TestResult.java:106)I/TestRunner(6220): at junit.framework.TestResult.runProtected(TestResult.java:124)I/TestRunner(6220): at junit.framework.TestResult.run(TestResult.java:109)I/TestRunner(6220): at junit.framework.TestCase.run(TestCase.java:118)I/TestRunner(6220): at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)I/TestRunner(6220): atandroid.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)I/TestRunner(6220): atandroid.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:545)I/TestRunner(6220): atandroid.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551)I/TestRunner(6220): ----- end exception -----I/TestRunner(6220): finished: testSubtration(android.myexample.cts.MySampleCalculatorTest)I/ActivityManager(1143): Force stopping package com.android.cts.myexample uid=10036I/ActivityManager(1143): Killing proc 6220:com.android.cts.myexample/10036: force stopD/AndroidRuntime(6210): Shutting down VM

android java 怎么设置悬浮窗(悬浮窗是一个activity)上组件的属性,和按钮的点击

if (instrumentation != null) { try { instrumentation.callApplicationOnCreate(app); } catch (Exception e) { if (!instrumentation.onException(app, e)) { throw new RuntimeException( "Unable to create application " + app.getClass().getName() + ": " + e.toString(), e); } }

Android 手机自动化测试工具有哪几种

appium,robotium,macaca,uiautomator,espresso,monkey等

如何增加 android instrumentation

Android单元测试是通过junit框架来测试的。Android中建立JUnit测试环境有以下方法。集成步骤:1.在androidManifest.xml文件中添加以下代码:<instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.example.junittest" android:label="@string/app_name"></instrumentation>2.新建一个测试测试类并继承AndroidTestCase类,编写测试方法,在测试方法内使用断言assert来测试要测试的方法。3.点击右面的大纲视图,选择要测试的方法,右键,run as --->Android JUnit test 。

如何获得Android设备名称

点设置里面的关于本机,就可以看见设备名

如何获取Android唯一标识

DEVICE_ID这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且唯一性良好。这个DEVICE_ID可以同通过下面的方法获取:TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String DEVICE_ID = tm.getDeviceId(); 它会根据不同的手机设备返回IMEI,MEID或者ESN码,但在使用的过程中有以下问题:非手机设备:最开始搭载Android系统都手机设备,而现在也出现了非手机设备:如平板电脑、电子书、电视、音乐播放器等。这些设备没有通话的硬件功能,系统中也就没有TELEPHONY_SERVICE,自然也就无法通过上面的方法获得DEVICE_ID。权限问题:获取DEVICE_ID需要READ_PHONE_STATE权限,如果只是为了获取DEVICE_ID而没有用到其他的通话功能,申请这个权限一来大才小用,二来部分用户会怀疑软件的安全性。厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾,如:zeros或者asterisksMAC ADDRESS可以使用手机Wifi或蓝牙的MAC地址作为设备标识,但是并不推荐这么做,原因有以下两点:硬件限制:并不是所有的设备都有Wifi和蓝牙硬件,硬件不存在自然也就得不到这一信息。获取的限制:如果Wifi没有打开过,是无法获取其Mac地址的;而蓝牙是只有在打开的时候才能获取到其Mac地址。获取Wifi Mac地址:获取蓝牙 Mac地址:Sim Serial Number装有SIM卡的设备,可以通过下面的方法获取到Sim Serial Number:TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String SimSerialNumber = tm.getSimSerialNumber(); 注意:对于CDMA设备,返回的是一个空值!ANDROID_ID在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。可以通过下面的方法获取:import android.provider.Settings; String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID); ANDROID_ID可以作为设备标识,但需要注意:厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c。厂商定制系统的Bug:有些设备返回的值为null。设备差异:对于CDMA设备,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。Serial NumberAndroid系统2.3版本以上可以通过下面的方法得到Serial Number,且非手机设备也可以通过该接口获取。String SerialNumber = android.os.Build.SERIAL;

如何查看android的设备id

java获得android的imei号步骤: 1、权限添加: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 2、调用android的api TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String IMEI = telephonyManager.getDeviceId(); 3、adb命令获得: adb shell dumpsys iphonesubinfo 4、任何手机都可以在拨打电话的界面输入*#06# 来查看IMEI。

如何获取android设备唯一识别码

*#*#4636#*#*或者*#06#

Android能够获取到唯一的设备ID吗

能 有个就MAC地址的 那个就是唯一的

如何获取android设备id

1. The IMEI: 仅仅只对Android手机有效:  TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);  String szImei = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE  采用此种方法,需要在AndroidManifest.xml中加入一个许可:android.permission.READ_PHONE_STATE,并且用户应当允许安装此应用。作为手机来讲,IMEI是唯一的,它应该类似于 359881030314356(除非你有一个没有量产的手机(水货)它可能有无效的IMEI,如:0000000000000)。  2. Pseudo-Unique ID, 这个在任何Android手机中都有效  有一些特殊的情况,一些如平板电脑的设置没有通话功能,或者你不愿加入READ_PHONE_STATE许可。而你仍然想获得唯一序列号之类的东西。这时你可以通过取出ROM版本、制造商、CPU型号、以及其他硬件信息来实现这一点。这样计算出来的ID不是唯一的(因为如果两个手机应用了同样的硬件以及Rom 镜像)。但应当明白的是,出现类似情况的可能性基本可以忽略。要实现这一点,你可以使用Build类:  String m_szDevIDShort = "35" + //we make this look like a valid IMEI  Build.BOARD.length()%10+ Build.BRAND.length()%10 + Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + Build.DISPLAY.length()%10 + Build.HOST.length()%10 + Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + Build.TAGS.length()%10 + Build.TYPE.length()%10 + Build.USER.length()%10 ; //13 digits  大多数的Build成员都是字符串形式的,我们只取他们的长度信息。我们取到13个数字,并在前面加上“35”。这样这个ID看起来就和15位IMEI一样了。

如何查看自己安卓手机的Android Device ID

你是要找安卓基带版本号还是IMEI(移动设备身份码)。①如果要找安卓基带版本号,一般在设置里面最后一项都有一个“关于手机”,里面有手机详细的硬件信息。②如果楼主要找IMEI码,可以在拨号盘上按*#06#,每一个移动设备唯一对应15位IMEI码。

如何获取Android唯一标识

DEVICE_ID这是Android系统为开发者提供的用于标识手机设备的串号,也是各种方法中普适性较高的,可以说几乎所有的设备都可以返回这个串号,并且唯一性良好。这个DEVICE_ID可以同通过下面的方法获取:TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String DEVICE_ID = tm.getDeviceId(); 它会根据不同的手机设备返回IMEI,MEID或者ESN码,但在使用的过程中有以下问题:非手机设备:最开始搭载Android系统都手机设备,而现在也出现了非手机设备:如平板电脑、电子书、电视、音乐播放器等。这些设备没有通话的硬件功能,系统中也就没有TELEPHONY_SERVICE,自然也就无法通过上面的方法获得DEVICE_ID。权限问题:获取DEVICE_ID需要READ_PHONE_STATE权限,如果只是为了获取DEVICE_ID而没有用到其他的通话功能,申请这个权限一来大才小用,二来部分用户会怀疑软件的安全性。厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾,如:zeros或者asterisksMAC ADDRESS可以使用手机Wifi或蓝牙的MAC地址作为设备标识,但是并不推荐这么做,原因有以下两点:硬件限制:并不是所有的设备都有Wifi和蓝牙硬件,硬件不存在自然也就得不到这一信息。获取的限制:如果Wifi没有打开过,是无法获取其Mac地址的;而蓝牙是只有在打开的时候才能获取到其Mac地址。获取Wifi Mac地址:获取蓝牙 Mac地址:Sim Serial Number装有SIM卡的设备,可以通过下面的方法获取到Sim Serial Number:TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String SimSerialNumber = tm.getSimSerialNumber(); 注意:对于CDMA设备,返回的是一个空值!ANDROID_ID在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置。可以通过下面的方法获取:import android.provider.Settings; String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID); ANDROID_ID可以作为设备标识,但需要注意:厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c。厂商定制系统的Bug:有些设备返回的值为null。设备差异:对于CDMA设备,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。Serial NumberAndroid系统2.3版本以上可以通过下面的方法得到Serial Number,且非手机设备也可以通过该接口获取。String SerialNumber = android.os.Build.SERIAL;

如何查看自己安卓手机的Android Device ID

安卓系统手机的DEVICE ID只要很简单的一个命令就可以查看:1、点击电话,启动拨号界面,然后输入“*#*#8255#*#*”即可进入GTalk Service Monitor界面了。安卓系统手机的DEVICE ID只要很简单的一个命令就可以查看:GTalk Service Monitor界面2、红圈圈便是Device ID了。,,,求采纳

如何查看自己安卓手机的Android Device ID?

方法如下:1、打开拨号界面。2、点击电话,启动拨号界面,然后输入“*#*#8255#*#*”即可进入GTalk ServiceMonitor界面了。红圈圈住的便是Device ID了。什么是Device ID?Android ID用于唯一识别一部设备的一次刷机行为,虽然不能完全确定该设备的唯一性(真的唯一性是用IMEI号的),但是可以很大程度上过滤重复设备。这是移动互联网广告行业的基础,尤其是CPI广告,设备ID是非常重要的。CPI广告是按照实际的安装数量结算的,广告主可以用android id来排除重复的安装。能否传递android id直接影响某些广告是否能在某些地方投放。在RTB行业中,有很多第三方提供数据的公司,他们买卖数据也都是靠的android的id将各种数据对应到用户身上。

如何查看自己安卓手机的Android Device ID

安卓系统手机的DEVICE ID只要很简单的一个命令就可以查看:1、点击电话,启动拨号界面,然后输入“*#*#8255#*#*”即可进入GTalk Service Monitor界面了。安卓系统手机的DEVICE ID只要很简单的一个命令就可以查看:GTalk Service Monitor界面2、红圈圈便是Device ID了。

如何查看自己安卓手机的Android Device ID

设备号的话,你可以进去设置,查看我的手机,里面有手机的基本信息

求助各位大神如何更改DeviceID,不是AndroidID

AndroidID只要root手机通过钛备份即可修改,但我想知道如何修改DeviceID,就是下图中红框位置的数字,谢谢。

android 手机 系统升级 device id 会改变么

试过多种方法了,因为android的IMEI已经无法获得了。一般地都是使用各种方法生成UUID,但是实践发现,一些貌似不变的“硬件”参数,安卓手机系统升级之后,依然会变,这个很烦,目前还没有人整理出最稳定的参数表,单纯几个手机厂商的这些参数信息,重复性太高,根本不算是UUID,等有心人整理看看

Android里DeviceId和AndroidId都是什么意思?

首先这两个ID都可以满足所说的情景,不同的应用拿到的这两个ID都一样,同一个应用重新安装以后也不会变。区别是,AndroidId在设备reset以后会发生改变,DeviceId永远不变。

Android平台的智游推送怎么获取DeviceID

这个函数在智游官方文档里有的,函数是PushManager.getInstance().getDeviceId(Context context);

android device id 会发生改变吗

不会。

如何获取GAID,Android ID和IMEI

Android设备不同类型的识别设备ID。·唯一编号(IMEI,MEID,ESN,IMSI)·MAC地址·序列号·ANDROID_ID唯一编号(IMEI,MEID,ESN,IMSI)说明在以前,当Android设备均作为电话使用时,寻找唯一标识号比较简单:()可用于找到(取决于网络技术)手机硬件唯一的IMEI,MEID,ESN和IMSI编号。TelephonyManager.getDeviceIdIMEI,MEID,ESN,IMSI的定义如下:u2022IMEI(国际移动设备识别码)唯一编号,用于识别GSM,WCDMA手机以及一些卫星电话(移动设备识别码)全球唯一编号,用于识别CDMA移动电台设备的物理硬件,MEID出现的目的是取代ESN号段(电子序列号)(电子序列号)唯一编号,用于识别CDMA手机(国际移动用户识别码)与所有GSM和UMTS网络手机用户相关联的唯一识别编号如需要检索设备的ID,在项目中要使用以下代码:u2022MEIDu2022ESNu2022IMSIimportandroid.telephony.TelephonyManager;importandroid.content.Context;Stringimeistring=null;Stringimsistring=null;{TelephonyManagertelephonyManager;telephonyManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);/**getDeviceId()functionReturnstheuniquedeviceID.*forexample,theIMEIforGSMandtheMEIDorESNforCDMAphones.*/imeistring=telephonyManager.getDeviceId();/**getSubscriberId()functionReturnstheuniquesubscriberID,*forexample,theIMSIforaGSMphone.*/imsistring=telephonyManager.getSubscriberId();}

如何查看自己安卓手机的Android Device ID

首先呢只说了硬件ID,不清楚你是要找安卓基带版本号还是IMEI(移动设备身份码)。①如果要找安卓基带版本号,一般在设置里面最后一项都有一个“关于手机”,里面有手机详细的硬件信息。②如果楼主要找IMEI码,可以在拨号盘上按*#06#,每一个移动设备唯一对应15位IMEI码。

如何查看自己安卓手机的Android Device ID

首先呢楼主只说了硬件ID,我不清楚你是要找安卓基带版本号还是IMEI(移动设备身份码)。①如果要找安卓基带版本号,一般在设置里面最后一项都有一个“关于手机”,里面有手机详细的硬件信息。②如果楼主要找IMEI码,可以在拨号盘上按*#06#,每一个移动设备唯一对应15位IMEI码。

Android Studio没法import Module?

我也出现这个问题,好像新版Android studio到这里就是点不了,我下载了4.1.1版本Android studio就可以

Android 判断快捷方式是否存在

最近一直想找如何判断快捷方式是否已经创建的方法,最后终于结合几家算可以啦,不知道对不对,其实快捷方式信息是保存在com.android.launcher的launcher.db的favorites表中,相关代码:java代码:boolean isInstallShortcut = false ; final ContentResolver cr = context.getContentResolver(); final String AUTHORITY = "com.android.launcher.settings"; final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/favorites?notify=true"); Cursor c = cr.query(CONTENT_URI, new String[] {"title","iconResource" }, "title=?", new String[] {"XXX" }, null);//XXX表示应用名称。 if(c!=null && c.getCount()0){ isInstallShortcut = true ; } /*try { while (c.moveToNext()) { String tmp = ""; tmp = c.getString(0); } } catch (Exception e) { } finally { c.close(); }*/ return isInstallShortcut ; }

android 怎么查询某个快捷方式已创建

参考setting模块的代码,新增一个类:public class CreateShortcut extends LauncherActivity {}android manifest.xml 中设置action:<activity android:name="CreateShortcut" android:label="@string/settings_shortcut"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>

桌面虚拟化传输协议之android spice

云计算是目前计算机领域的一个热门领域,桌面虚拟化是其中的一个重要应用,即把桌面系统在服务器端虚拟化,然后通过传输协议传输数据到客户端来实现桌面虚拟化,这样的好处就在于不管用什么设备,只要通过客户端都可以访问到云端的系统,随时随地都可以在一个系统上工作。 目前有两大标准的桌面传输协议,分别是RBP和RDP。那么对于移动设备来说,很显然,RDP协议更适合移动设备,因为移动设备在3G,4G情况下不可能用耗费大流量的RFB协议,并且延迟比较高。而RDP协议由于传输的数据量较少,对网络条件要求不高。所以,针对于移动平台来说,RDP协议比较合适。 但是,由于RDP协议是微软的产品,受限于其证书,并不是开源产品,所以不能用于移动设备。那么,开源的类RDP协议的 SPICE 协议,就隆重登场了,结合我们的主题,在android平台上应用spice协议。下面,我们来介绍spice在android平台上的应用。 Spice事实上并没有android版本,但是它有linux版本,而android是基于linux的,所以,我们可以通过使用NDK来交叉编译Spice库到android上使用。也就是说,我们可以通过使用JNI来调用libspice.so(通过NDK交叉编译),从而在android平台上使用Spice。Spice服务器通过通道(Channel)来与客户端通信,其中jpeg模块是通过NDK编译好的库,使用JNI调用,把服务器发送过来图像命令转化为图像,再把图像交给android的View显示出来。 在实际使用中,需要对图像的解析过程进行优化,否则显示的延迟很大。一个解决方案是使用更快的jpeg解析库。 最后,推荐一个开源的spice安卓客户端 remote-desktop-clients 以上只是对Spice工作原理的简单描述,详细介绍查看官方文档:

三星s7升级android 7.0后vr眼镜能正常用吗

三星S7支持Gear VR,建议您可以自行连接尝试:连接手机后,手机会提示安装Gear VR的相关插件和对应应用程序,如果均可以正常安装并连接,即可使用。

cloneable 有什么用 多余android

Object中的clone执行的时候使用了RTTI(run-time type identification)的机制,动态找到目前正在调用clone方法的那个reference,根据它的大小申请内存空间,然后进行bitwise的复制,将该对象的内存空间完全复制到新的空间中去,从而达到shallowcopy的目的,所以你调用super.clone() 得到的是当前调用类的副本,而不是父类的副本。

手机里面的emotion和android是什么关系?两个系统?

android是操作系统,emotion相当于上面的一套UI界面~

Android认证包括什么?android认证只包括GMS认证吗?

什么是GMS?为什么要过GMS?1、什么是GMS?百度百科是这样介绍的:GSM是1992年欧洲标准化委员会统一推出的“Global System For Mobile Communication”标准(全球移动通信系统)的缩写,它采用数字通信技术、统一的网络标准,使通信质量得以保证,并可以开发出更多的新业务供用户使用。我的理解就是:Google为了规范Android系统,为Android系统定义的一些标准,来达到对系统的规范管理!2、为什么要过GMS?其实我们都知道,我们国内的Android手机其实都是不过GMS认证。所以国内的那些手机厂商对Android系统的改动就可以尽情发挥自己脑洞去设计,去开发。所以就出现了各个厂商(华为、小米、魅族、OV)的OS 系统啊(Flyme OS、360 OS 、Freeme OS等等)。但是在国外就不一样了,国外很多客户他们使用手机的各种功能多样性,就得依赖到Google给他们提供的服务,比如到Google应用商城上下载应用,你就得过GMS认证;同样的为了Android系统的安全性,也是需要过GMS认证。二、GMS测试认证的流程前提SN_Write_tool工具给手机写入IMEI,SN号(IMEI查询:*#06#SN:Settings-About phone-Status-Serial number)插入SIM卡,SD卡模式选择:Use as portable storage,手机写入IMEI SN号,IMEI查询:*#06#SN:Settings-About phone-Status-Serial number语言选择:必须选择English(United States)连接wifi,需要连接可以访问外网的wifiDisplay-Sleep选择除永不休眠以外最大的一项Location默认打开,选择高精Security-Screen lock-NoneDate&time选择默认12小时Developer options(Stay awake打开;USB debugging打开;Verify apps over USB关闭)Chrome设置(GTS 点击Chrome--ACCEPT&CONTINUE--NO THANKS)CTS进入cts工具目录run cts-suite -s 设备序列号1 --shard-count 设备数量跑测失败项:run cts --retry 上一次的ID-s 设备序列号1 --shard-count 设备数量 --exclude-filter 过滤项GTS进入GTS工具目录run gts -s 设备序列号1 --shard-count 设备数量跑测失败项:run retry --retry 上一次的ID -s 设备序列号1STS(使用userdebug软件版本,其他使用user版本,,注:保持fingerprint一致)进入STS工具目录run sts-engbuild -s 设备序列号1 --shard-count 设备数量run sts-engbuild --retry 上一次的ID -s 设备序列号1 --shard-count 设备数量 (指定跑测类型:run sts-engbuild --retry 上一次的ID --retry-type failed -s 设备序列号1)VTS(有两个跑测报告)(1) Please enable OEM unlocking in settings (开发者选项中设置)(2) Please enable USB debugging in settings(开发者选项中设置)(3)adb reboot bootloader(CMD窗口输入)(4)fastboot flashing unlock(CMD窗口输入)(5) press volume up key(按音量+)(6) fastboot flash system system.img (CMD界面中下这条命令)(7)fastboot reboot (CMD界面中下这条命令)(8)重复手机端设置(前提)VTS(1)进入VTS工具目录(2)run vts -s 设备序列号1 --shard-count 设备数量(3)run vts --retry 上一次的ID -s 设备序列号1CTS-GSI(1)进入VTS工具目录(2)run cts-on-gsi -s 设备序列号1 -s 设备序列号2 --shard-count 设备数量(3)跑测失败项:run cts-on-gsi --retry 上一次跑测完的ID -s 设备序列号1三、跑测完成,生成测试报告跑测完的每一份报告都在相对应的工具目录的result目录下。WX:CTC-labs

android5.0新特性/新功能有哪些

--“Material Design”材料设计Android 5.0 Lollipop最大的变化在于UI用户界面的设计,新的Android 5.0 Lollipop将会采用全新的“Material Design”设计规范,新的用户界面更加简洁、色彩更加丰富。动画效果更加合理生动,同时加入实时阴影的3D视图,更多的使用卡片风格的显示效果。全平台风格也变得更为统一。--新的通知中心Android 5.0 Lollipop通知中心融入更多的卡片式风格,即使是在锁屏状态下也可以进行多种功能操作。同时用户可以自定义通知的优先级别,使得用户不会错过任何重要的通知。还可以设置特定的通知权限,只有被允许的通知消息才会推送。同时还具有操作性,比如用户在游戏时有电话打入,不会以全屏显示,而是弹出可操作的通知卡片,用户可选择接听或拒接,不影响游戏继续进行。--更好的电池续航Android 5.0 Lollipop更好的优化了系统的续航,系统能够根据电池电量来减少处理器功耗、屏幕亮度等等,能为为用户带来额外90分钟的续航时间。--更安全新设备将会自动启动加密功能,以防止丢失或被盗设备上的数据被盗。同时SELinux将会强制对所有的应用进行安全漏洞和恶意软件的扫描。用户还可以用Android Wear设备对你的手机和平板电脑进行配对,使用Android Wear解锁你的手机平板更加安全方便。--设备共享假设你忘记带手机,你让可以在另一个运行Android 5.0 Lollipop的设备上访问你的个人信息。Android 5.0 Lollipop还来带全新的访客模式,用户可以设置锁定设备中的特定信息,不让他人访问查看。--更强的性能和流畅的系统体验Android 5.0 Lollipop可以提供高达4倍的性能提升,将迎来全新的ART底层架构,彻底告别Java虚拟机。在运行速度,流畅性上更出色。同时兼容ARM、X86和MIPS等架构。还将首次加入对64位处理器的支持。提供桌面级别的性能体验。同时提供64位的Chrome浏览器,Gmail,日历,谷歌播放音乐等等。--强大的多媒体全面提升系统的音频、视频、拍照功能。支持多声道,通知支持插入USB麦克风,无数音频设备都能接入你的Android设备。OpenGL ES 3.1的支持,使得Android与桌面设备一样在图形化处理上走在了最前沿。同时支持RAW格式,支持30 fps全分辨率视频拍摄。更好的视频解码使得播放视频更加省电。--更多功能更强大、低功耗的蓝牙功能提高文字的对比度和色彩反转,改善阅读体验支持多达68种语言更加简单安全的支付功能改善池,蓝牙,数据显示Android Beam:Android设备之间传文件只需轻轻一碰系统支持双击唤醒(需要硬件支持)改善键盘配件支持1、Tap and Go  Tap and Go功能支持用户通过NFC配对两部Lollipop系统手机,旧手机可以将需要备份的全部内容,通过蓝牙传输给新手机。  2、OK Google语音指令  在新系统中,OK Google语音搜索功能得到进一步的优化。不论你的手机是否处在熄屏状态,你只需对手机轻轻说声“OK Google”,手机即刻被唤醒,例如当你连续说“OK Google,take a photo”,“OK Google,play some music”等等,手机就会根据指令执行播放音乐、拍摄照片、启动搜索、发送短讯。  3、Double tap to wake(双击唤醒设备)  类似于OK Google语音指令,用户唤醒设备也只需简单的轻轻双击屏幕。不过这个功能在Android 4.4操作系统下的诸多国产手机当中已经非常常见了。  4、Ambient Display  在新发布的搭载Android Lollipop系统的Google Nexus 6手机中,该功能得到了进一步的强化应用——当通知或消息到来时,在手机的锁屏界面就可直接阅读消息。不过系统中该功能的实现需要设备配置OLED显示屏。  5、Face unlock(面部解锁)  在Lollipop系统中,Google花费大力气优化了面部解锁功能。当用户拿起手机处理锁屏界面上的消息通知时,面部解锁功能便自动被激活。随意浏览几条消息之后,手机已经默默地完成了面部识别,解锁就是这么简单!  6、Lock screen notifications(锁屏通知中心)  Android Lollipop中加入了全新风格的通知系统,改进后的通知系统会优先显示由用户设定的重要的信息,而将不太紧急的内容隐藏起来。用户只需要向下滑动就可以查看全部的通知内容,如果是短信、微信,就可以再通知栏里直接进行回复,非常人性化。  7、Priority Mode(优先模式)  借助Priority Mode模式中,用户挑选出“允许打扰”的app应用(剩下的就是“不允许打扰”类)。同时设定模式的持续时间,时间过后系统将会自动回到普通状态,以防止用户忘记关闭Priority Mode模式从而影响正常使用。  8、Guest Mode(访客模式)  Android Lollipop改善了支持多用户账户功能,并且为手机和平板设备提供了一种全新的Guest Mode访客模式。Guest Mode给每一位设备使用者都提供了安全绿色的一次性的操作空间,并且可以随时在guest account(访客账户)中删除用户数据。Android系统中的访客模式最早出现在LG平板电脑当中,其功用非常人性化,例如把手机、平板给不懂事儿的孩子使用时非常放心的。  9、Pin Apps(多任务视窗)  Lollipop在系统设置中提供了一项全新的功能——在多任务视窗中,给app应用窗口添加pin锁定代码。正如名字讲的那样,像是用别针锁定app应用,只用当输入正确的密码才能退出该app界面。虽然说与iOS系统的Guided Access功能也很像,但Guest Mode使用时好像更加简单快捷。  10、Improved Quick Settings(改进的快速设置)  快速设置界面得到了更好的规划改进,来优化用户体验。亮度调节变得更加灵活智能,默认初始设置是设备的亮度等级随着环境光线的变化而适当调节。同时音量调节滑动条也改进的更加人性化,也提供了多样的消息通知优先级按钮。  11、Overview(多任务一览)  多任务视窗现在有了一个新的名字Overview。在界面中,每一个app都是一张独立的卡片,拥有立体式的层叠效果,用户可以设定“最近应用程序”,通过滑动来快速切换app。最值得称道的一点是,像一个多叉树那样,在每一个app目录之下还能继续创建多重卡片。  12、Material Design  Google重新设计了更加趋于扁平化的Lollipop系统UI,称为Material Design。在今年6月26日举办的I/O 2014开发者大会上,许多人就已经提前领略到Material Design出色的功能了。到现在,它得到了更多的优化,例如给通讯录联系人添加不同的颜色优先等级。新的UI设计,在基本元素的处理上,借鉴了传统的印刷设计,从字体版式、网格系统,到空间、比例、配色、图像等方面,都惊醒了大胆的平面化的创新。这一举措,无疑是加大了国产UI设计的难度与门槛。

android 使用volley时怎样改变参数的encode编码

IE、Firefox、Opera三种浏览器对URL的传输的处理各不相同,浏览器在传输URl时得对URL进行编码,IE默认是以UTF-8来传输的,Opera可能也是以UTF-8编码的,Firefox经过测试肯定不是以UTF-8来编码的,有可能是以ISO-8859-1来编码的。所以如果不对中文进行处理,那么中文字符经各个浏览器以自己的编码方式传输到服务器后就出现了各种编码方式,而服务器却只能以一种编码方式来对接收到的URL进行解码。这样的话,和服务器使用的编码方式一样的浏览器在使用带中文的URl时不会出现问题,其他的浏览器则会出现问题。所以解决的办法就是在URL进行传输之前对其中的中文进行编码,使用的编码是和服务器一样的编码,假设服务器使用的编码是UTF-8,则编码语句如下:URLEncoder.encode("中文","UTF-8")。这样对中文进行编码后所有的浏览器都不会再用他们默认的编码方式对中文进行编码,因为此时浏览器看到的已经不是中文了,而是编码后的字节码。这样就避开了浏览器传输URL时编码的差异性问题。对中文参数问题的解决方式和上面一样。但这里所指的中文参数是指以?name="中文参数"方式附在URL后,以get方法传输到服务器的这种形式,并不是以表单形式提交到服务器的。各浏览器对中文参数的处理方式和各自对URL中中文的处理方式都不相同,各浏览器之间也有差异,有的在传输之前不进行编码,有的在传输之前就已经进行了编码,情形非常复杂。但是我们以不变应万变,都用URLEncoder.encode("中文","UTF-8")对中文参数进行编码,这样不管各浏览器怎样对中文参数进行处理,此时经过我们编码后的中文对浏览器来说就是字节码,与a、b、c等字母没有什么区别。但是服务器会用UTF-8编码形式来还原中文参数。总结一下:以Tomcat服务器为例,在中添加URIEncoding="UTF-8",设置tomcat以utf-8的编码方式来处理URL。其次,对URL中的中文和中文参数都用URLEncoder.encode("中文","UTF-8")进行编码。再有,就是在后台进行转码。点击后打开新页面,用户登录!用户名为中文时,火狐、google浏览器无问题,但IE有乱码问题:问题代码:Java代码 <a href="member!sysLogin.do?name="${member.uname }"" target="_blank" />登录</a> 超链接形式的传参,都是Get方式!Java代码 public String sysLogin(){ try{ name=new String(name.getBytes("iso-8859-1"),"utf-8"); int r = this.memberManager.loginbysys(name); if(r==1){ return "syslogin"; } this.msgs.add("登录失败"); }catch(RuntimeException e){ this.msgs.add(e.getMessage()); } catch (UnsupportedEncodingException e) { this.msgs.add(e.getMessage()); } return this.MESSAGE; } 修改成功:Java代码 <a href="javascript:toSysLogin("${member.uname }");" />登录</a> function toSysLogin(name){ var uriname="member!sysLogin.do?name="+name; window.open( encodeURI(uriname)); }

Android监听Home键和Back键的区别介绍

一:Android 中Home键监听和Back键监听的区别:(1).在Android中,当按下Home键的时候,默认情况下Stop前台的Activity,即Activity设置成停止状态【onStop()】,而不是销毁状态【onDestory()】。如果再次启动该Activity,不是调用onCreate()方法,而是调用onSavedInstanceState方法。则是从onRestart()开始-onStart()-onResume()。 (2).当按下back键则不同,back键默认finish前台的activity,即activity的状态为onDestory为止,再次启动该activity则从onCreate开始,不会调用onSavedInstanceState方法。 总而言之:按下Home键会返回桌面,而back则会返回前一个activity。在这里Back键的实现方法就不赘述了,主要讲解一下Home键的实现方式吧。以下是个人找的参考资料自己思考的。Home键监听的实现方法: (1).在onResum里面注册广播,OnPause里面注销广播。 (2).在广播中拦截Intent.ACTION_CLOSE_SYSTEM_DIALOGS 这个Action ,通过获取Reason字段 来判断长按 还是单击Home键。 代码如下:(1).Home键监听封装类:package com.scd.homewatcher.util;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.util.Log;/** * Home键监听封装 * * @author way * */public class HomeWatcher { // 回调接口 public interface OnHomePressedListener { public void onHomePressed(); public void onHomeLongPressed(); } private static final String TAG = "HomeWatcher"; /** 上下文 */ private Context mContext; /** 过滤器 */ private IntentFilter mFilter; /** 接口 */ private OnHomePressedListener mListener; /** 广播接收者 */ private InnerRecevier mRecevier; public HomeWatcher(Context context) { mContext = context; mRecevier = new InnerRecevier(); mFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); } /** * 设置监听 * * @param listener */ public void setOnHomePressedListener(OnHomePressedListener listener) { mListener = listener; } /** * 开始监听,注册广播 */ public void startWatch() { if (mRecevier != null) { mContext.registerReceiver(mRecevier, mFilter); } } /** * 停止监听,注销广播 */ public void stopWatch() { if (mRecevier != null) { mContext.unregisterReceiver(mRecevier); } } /** * 广播接收者 */ private class InnerRecevier extends BroadcastReceiver { final String SYSTEM_DIALOG_REASON_KEY = "reason"; final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions"; final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps"; final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (reason != null) { Log.i(TAG, "action:" + action + ",reason:" + reason); if (mListener != null) { if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { // 短按home键 mListener.onHomePressed(); } else if (reason .equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) { // 长按home键 mListener.onHomeLongPressed(); } } } } } }}(2).MainActivity类:package com.scd.homewatcher;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.widget.Toast;import com.scd.homewatcher.util.HomeWatcher;import com.scd.homewatcher.util.HomeWatcher.OnHomePressedListener;public class MainActivity extends Activity implements OnHomePressedListener { private HomeWatcher mHomeWatcher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onResume() { mHomeWatcher = new HomeWatcher(this); mHomeWatcher.setOnHomePressedListener(this); // 注册广播 mHomeWatcher.startWatch(); super.onResume(); } @Override protected void onPause() { mHomeWatcher.setOnHomePressedListener(null); // 注销广播 mHomeWatcher.stopWatch(); super.onPause(); } @Override public void onHomePressed() { // TODO Toast.makeText(this, "短按Home键,实现自己的逻辑", Toast.LENGTH_SHORT).show(); } @Override public void onHomeLongPressed() { // TODO Toast.makeText(this, "长按Home键,实现自己的逻辑", Toast.LENGTH_SHORT).show(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { System.out.println("按下了back键 onKeyDown()"); return false; } else { return super.onKeyDown(keyCode, event); } } @Override public void onBackPressed() { // super.onBackPressed()会自动调用finish()方法,关闭 super.onBackPressed(); }}

android sqlite cursor怎么得到date类型 csdn

在android的sqlite中存取DATETIME类型的方法。创建表时:String sql="create table tb3(idINTEGER PRIMARY KEY,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, weight DOUBLE)";timestamp字段缺省值是当前时间(基于GMT而不是local time)。这问题导致了记录的时间跟本地实际时间有几个小时的差距,费了我好大工夫才找到解决方法: 存的时候不变,取的时候根据自己所在时区调整时间。这是sqlite中的一个函数datetime所做的工作。读取时的方法:[java] view plaincopyprint?<span style="font-size:12px;">Cursor cursor = db.rawQuery("selectweight,datetime(timestamp,"localtime") from tb3",null); String myDate =cursor.getString(cursor.getColumnIndex("datetime(timestamp,"localtime")")); SimpleDateFormat format = newSimpleDateFormat("yyyy-MM-dd HH:mm"); Date date = format.parse(myDate);</span> 插入数据时,由于timestamp和id能自动生成,只需插入体重数据:ContentValues values=newContentValues(); double nowWeight = Double.parseDouble(weightStr); values.put("weight", nowWeight); db = sqlHelper.getWritableDatabase(); db.insert("tb3", null,values); db.close();

腾讯游戏iOS和Android数据不互通的原因是什么

可能是两家公司没有达成共识吧 各赚各的

三星GT-I9082i,系统是Android4.1.2版本,下载WPS office软件,打不开邮件中office文档,请问是怎么回事

祝你能马上实现你的愿望!祝你能马上实现你的愿望!

如何在不同Android设备中得到有效的AudioRecord实例

Pardo对类的描述是AudioMeter包裹了AudioRecord,但bill在阅读后发现AudioMeter实际上隐藏了AudioRecord的接口(如read),当然Pardo的软件可能并不需要read接口,但作为AudioRecord的倒腾者,bill是需要的,因此对AudioMeter做了轻量级修改,开放了AudioRecord的部分常用接口,使用起来也比较方便,现分享出来,希望的朋友受益于此,大家可以根据自己的需要完善、扩充这个工具类:importjava.nio.ByteBuffer;importandroid.media.AudioFormat;importandroid.media.AudioRecord;importandroid.media.MediaRecorder.AudioSource;importandroid.os.Process;/***BasicallywhatthisclassdoesisconstructavalidAudioRecordObject,wrapAudioRecordmethods,andprovide*conversiontodecibels.ItalsocachestheAudioRecordconfigurationandpreventsmultipleinstancesoftherecorder.**@authorMichael-Pardo/billhoo*@version0.12013-2-18*///TODO(billhoo)theAudioMeter.createAudioRecord()methodalwaysreturnedthefirstmatchedconfigurationcurrently,//ifthefirstcombination[8000Hz+PCM16+IN_MONO]isvalid,methodreturns,butthereisnowayifIwannause//16000Hzinstead,sothismethodshouldbechangedtoacleveroneinthefuture.publicclassAudioMeterextendsThread{///////////////////////////////////////////////////////////////////PRIVATECONSTANTSprivatestaticfinalfloatMAX_REPORTABLE_AMP=32767f;privatestaticfinalfloatMAX_REPORTABLE_DB=90.3087f;///////////////////////////////////////////////////////////////////PRIVATEMEMBERSprivateAudioRecordmAudioRecord;privateintmSampleRate;privateshortmAudioFormat;privateshortmChannelConfig;privateshort[]mBuffer;privateintmBufferSize=AudioRecord.ERROR_BAD_VALUE;privateintmLocks=0;///////////////////////////////////////////////////////////////////CONSTRUCTORprivateAudioMeter(){Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);//settheAudioMeterthreadinURGENT_AUDIO//priority.createAudioRecord();}///////////////////////////////////////////////////////////////////PUBLICMETHODSpublicstaticAudioMetergetInstance(){returnInstanceHolder.INSTANCE;}publicfloatgetAmplitude(){return(float)(MAX_REPORTABLE_DB+(20*Math.log10(getRawAmplitude()/MAX_REPORTABLE_AMP)));}publicsynchronizedvoidstartRecording(){if(mAudioRecord==null||mAudioRecord.getState()!=AudioRecord.STATE_INITIALIZED){thrownewIllegalStateException("startRecording()calledonanuninitializedAudioRecord.");}if(mLocks==0){mAudioRecord.startRecording();}mLocks++;}publicsynchronizedvoidstopRecording(){mLocks--;if(mLocks==0){if(mAudioRecord!=null){mAudioRecord.stop();mAudioRecord.release();mAudioRecord=null;}}}/***Readsaudiodatafromtheaudiohardwareforrecordingintoadirectbuffer.Ifthisbufferisnotadirect*buffer,thismethodwillalwaysreturn0.**@paramaudioBuffer*thedirectbuffertowhichtherecordedaudiodataiswritten.*@paramsizeInBytes*thenumberofrequestedbytes.*@returnthenumberofbytesthatwerereadoror{@link#ERROR_INVALID_OPERATION}iftheobjectwasn"tproperly*initialized,or{@link#ERROR_BAD_VALUE}iftheparametersdon"tresolvetovaliddataandindexes.The*numberofbyteswillnotexceedsizeInBytes.*/publicintread(ByteBufferaudioBuffer,intsizeInBytes){returnmAudioRecord.read(audioBuffer,sizeInBytes);}/***Readsaudiodatafromtheaudiohardwareforrecordingintoabuffer.**@paramaudioData*thearraytowhichtherecordedaudiodataiswritten.*@paramoffsetInShorts*indexinaudioDatafromwhichthedataiswrittenexpressedinshorts.*@paramsizeInShorts*thenumberofrequestedshorts.*@returnthenumberofshortsthatwerereadoror{@link#ERROR_INVALID_OPERATION}iftheobjectwasn"tproperly*initialized,or{@link#ERROR_BAD_VALUE}iftheparametersdon"tresolvetovaliddataandindexes.The*numberofshortswillnotexceedsizeInShorts.*/publicintread(short[]audioData,intoffsetInShorts,intsizeInShorts){returnmAudioRecord.read(audioData,offsetInShorts,sizeInShorts);}/***Readsaudiodatafromtheaudiohardwareforrecordingintoabuffer.**@paramaudioData*thearraytowhichtherecordedaudiodataiswritten.*@paramoffsetInBytes*indexinaudioDatafromwhichthedataiswrittenexpressedinbytes.*@paramsizeInBytes*thenumberofrequestedbytes.*@returnthenumberofbytesthatwerereadoror{@link#ERROR_INVALID_OPERATION}iftheobjectwasn"tproperly*initialized,or{@link#ERROR_BAD_VALUE}iftheparametersdon"tresolvetovaliddataandindexes.The*numberofbyteswillnotexceedsizeInBytes.*/publicintread(byte[]audioData,intoffsetInBytes,intsizeInBytes){returnmAudioRecord.read(audioData,offsetInBytes,sizeInBytes);}/***ReturnstheconfiguredaudiodatasamplerateinHz*/publicintgetSampleRate(){returnmSampleRate;}/***Returnstheconfiguredaudiodataformat.See{@linkAudioFormat#ENCODING_PCM_16BIT}and*{@linkAudioFormat#ENCODING_PCM_8BIT}.*/publicintgetAudioFormat(){returnmAudioFormat;}/***Returnstheconfiguredchannelconfiguration.See{@linkAudioFormat#CHANNEL_IN_MONO}and*{@linkAudioFormat#CHANNEL_IN_STEREO}.*/publicintgetChannelConfiguration(){returnmChannelConfig;}/***ReturnsthestateoftheAudioRecordinstance.ThisisusefulaftertheAudioRecordinstancehasbeencreatedto*checkifitwasinitializedproperly.Thisensuresthattheappropriatehardwareresourceshavebeenacquired.**@seeAudioRecord#STATE_INITIALIZED*@seeAudioRecord#STATE_UNINITIALIZED*/publicintgetAudioRecordState(){returnmAudioRecord.getState();}///////////////////////////////////////////////////////////////////PRIVATEMETHODSprivatevoidcreateAudioRecord(){if(mSampleRate>0&&mAudioFormat>0&&mChannelConfig>0){mAudioRecord=newAudioRecord(AudioSource.MIC,mSampleRate,mChannelConfig,mAudioFormat,mBufferSize);return;}//TODO(billhoo)shouldtryuser"sspecificcombinationsfirst,ifit"sinvalid,thendoforlooptogeta//availablecombinationinstead.//Findbest/compatibleAudioRecord//Ifallcombinationsareinvalid,throwIllegalStateExceptionfor(intsampleRate:newint[]{8000,11025,16000,22050,32000,44100,47250,48000}){for(shortaudioFormat:newshort[]{AudioFormat.ENCODING_PCM_16BIT,AudioFormat.ENCODING_PCM_8BIT}){for(shortchannelConfig:newshort[]{AudioFormat.CHANNEL_IN_MONO,AudioFormat.CHANNEL_IN_STEREO,AudioFormat.CHANNEL_CONFIGURATION_MONO,AudioFormat.CHANNEL_CONFIGURATION_STEREO}){//Trytoinitializetry{mBufferSize=AudioRecord.getMinBufferSize(sampleRate,channelConfig,audioFormat);if(mBufferSize0){returnsum/bufferReadSize;}return0;}///////////////////////////////////////////////////////////////////PRIVATECLASSES//SingletonprivatestaticclassInstanceHolder{privatestaticfinalAudioMeterINSTANCE=newAudioMeter();}}

如何在不同Android设备中得到有效的AudioRecord实例

import java.nio.ByteBuffer; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder.AudioSource; import android.os.Process; /** * Basically what this class does is construct a valid AudioRecord Object, wrap AudioRecord methods, and provide * conversion to decibels. It also caches the AudioRecord configuration and prevents multiple instances of the recorder. * * @author Michael-Pardo/billhoo * @version 0.1 2013-2-18 */ // TODO(billhoo) the AudioMeter.createAudioRecord() method always returned the first matched configuration currently, // if the first combination [8000Hz + PCM16 + IN_MONO] is valid, method returns, but there is no way if I wanna use // 16000Hz instead, so this method should be changed to a clever one in the future. public class AudioMeter extends Thread { // /////////////////////////////////////////////////////////////// // PRIVATE CONSTANTS private static final float MAX_REPORTABLE_AMP = 32767f; private static final float MAX_REPORTABLE_DB = 90.3087f; // /////////////////////////////////////////////////////////////// // PRIVATE MEMBERS private AudioRecord mAudioRecord; private int mSampleRate; private short mAudioFormat; private short mChannelConfig; private short[] mBuffer; private int mBufferSize = AudioRecord.ERROR_BAD_VALUE; private int mLocks = 0; // /////////////////////////////////////////////////////////////// // CONSTRUCTOR private AudioMeter() { Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO); // set the AudioMeter thread in URGENT_AUDIO // priority. createAudioRecord(); } // /////////////////////////////////////////////////////////////// // PUBLIC METHODS public static AudioMeter getInstance() { return InstanceHolder.INSTANCE; } public float getAmplitude() { return (float) (MAX_REPORTABLE_DB + (20 * Math.log10(getRawAmplitude() / MAX_REPORTABLE_AMP))); } public synchronized void startRecording() { if (mAudioRecord == null || mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) { throw new IllegalStateException( "startRecording() called on an uninitialized AudioRecord."); } if (mLocks == 0) { mAudioRecord.startRecording(); } mLocks++; } public synchronized void stopRecording() { mLocks--; if (mLocks == 0) { if (mAudioRecord != null) { mAudioRecord.stop(); mAudioRecord.release(); mAudioRecord = null; } } } /** * Reads audio data from the audio hardware for recording into a direct buffer. If this buffer is not a direct * buffer, this method will always return 0. * * @param audioBuffer * the direct buffer to which the recorded audio data is written. * @param sizeInBytes * the number of requested bytes. * @return the number of bytes that were read or or {@link #ERROR_INVALID_OPERATION} if the object wasn"t properly * initialized, or {@link #ERROR_BAD_VALUE} if the parameters don"t resolve to valid data and indexes. The * number of bytes will not exceed sizeInBytes. */ public int read(ByteBuffer audioBuffer, int sizeInBytes) { return mAudioRecord.read(audioBuffer, sizeInBytes); } /** * Reads audio data from the audio hardware for recording into a buffer. * * @param audioData * the array to which the recorded audio data is written. * @param offsetInShorts * index in audioData from which the data is written expressed in shorts. * @param sizeInShorts * the number of requested shorts. * @return the number of shorts that were read or or {@link #ERROR_INVALID_OPERATION} if the object wasn"t properly * initialized, or {@link #ERROR_BAD_VALUE} if the parameters don"t resolve to valid data and indexes. The * number of shorts will not exceed sizeInShorts. */ public int read(short[] audioData, int offsetInShorts, int sizeInShorts) { return mAudioRecord.read(audioData, offsetInShorts, sizeInShorts); } /** * Reads audio data from the audio hardware for recording into a buffer. * * @param audioData * the array to which the recorded audio data is written. * @param offsetInBytes * index in audioData from which the data is written expressed in bytes. * @param sizeInBytes * the number of requested bytes. * @return the number of bytes that were read or or {@link #ERROR_INVALID_OPERATION} if the object wasn"t properly * initialized, or {@link #ERROR_BAD_VALUE} if the parameters don"t resolve to valid data and indexes. The * number of bytes will not exceed sizeInBytes. */ public int read(byte[] audioData, int offsetInBytes, int sizeInBytes) { return mAudioRecord.read(audioData, offsetInBytes, sizeInBytes); } /** * Returns the configured audio data sample rate in Hz */ public int getSampleRate() { return mSampleRate; } /** * Returns the configured audio data format. See {@link AudioFormat#ENCODING_PCM_16BIT} and * {@link AudioFormat#ENCODING_PCM_8BIT}. */ public int getAudioFormat() { return mAudioFormat; } /** * Returns the configured channel configuration. See {@link AudioFormat#CHANNEL_IN_MONO} and * {@link AudioFormat#CHANNEL_IN_STEREO}. */ public int getChannelConfiguration() { return mChannelConfig; } /** * Returns the state of the AudioRecord instance. This is useful after the AudioRecord instance has been created to * check if it was initialized properly. This ensures that the appropriate hardware resources have been acquired. * * @see AudioRecord#STATE_INITIALIZED * @see AudioRecord#STATE_UNINITIALIZED */ public int getAudioRecordState() { return mAudioRecord.getState(); } // /////////////////////////////////////////////////////////////// // PRIVATE METHODS private void createAudioRecord() { if (mSampleRate > 0 && mAudioFormat > 0 && mChannelConfig > 0) { mAudioRecord = new AudioRecord(AudioSource.MIC, mSampleRate, mChannelConfig, mAudioFormat, mBufferSize); return; } // TODO(billhoo) should try user"s specific combinations first, if it"s invalid, then do for loop to get a // available combination instead. // Find best/compatible AudioRecord // If all combinations are invalid, throw IllegalStateException for (int sampleRate : new int[] { 8000, 11025, 16000, 22050, 32000, 44100, 47250, 48000 }) { for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_8BIT }) { for (short channelConfig : new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.CHANNEL_CONFIGURATION_STEREO }) { // Try to initialize try { mBufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat); if (mBufferSize < 0) { continue; } mBuffer = new short[mBufferSize]; mAudioRecord = new AudioRecord(AudioSource.MIC, sampleRate, channelConfig, audioFormat, mBufferSize); if (mAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) { mSampleRate = sampleRate; mAudioFormat = audioFormat; mChannelConfig = channelConfig; return; } mAudioRecord.release(); mAudioRecord = null; } catch (Exception e) { // Do nothing } } } } // ADDED(billhoo) all combinations are failed on this device. throw new IllegalStateException( "getInstance() failed : no suitable audio configurations on this device."); } private int getRawAmplitude() { if (mAudioRecord == null) { createAudioRecord(); } final int bufferReadSize = mAudioRecord.read(mBuffer, 0, mBufferSize); if (bufferReadSize < 0) { return 0; } int sum = 0; for (int i = 0; i < bufferReadSize; i++) { sum += Math.abs(mBuffer[i]); } if (bufferReadSize > 0) { return sum / bufferReadSize; } return 0; } // /////////////////////////////////////////////////////////////// // PRIVATE CLASSES // Singleton private static class InstanceHolder { private static final AudioMeter INSTANCE = new AudioMeter(); } }

Android 使用MediaRecorder录音,调用stop()方法的时候报错

请 贴出错误log 最好加上你的代码

android系统休眠关闭了哪些功能

android系统休眠关闭了哪些功能 Android的几种不同的休眠模式 如果不进行特别的设定,Android会在一定时间后萤幕变暗,在萤幕变暗后一定时间内,约几分钟,CPU也会休眠,大多数的程式都会停止执行,从而节省电量。但你可以在程式码中通过对Powmanager API的呼叫来设定不同的休眠模式。 Flag Value CPU Screen Keyboard PARTIAL_WAKE_LOCK On* Off Off SCREEN_DIM_WAKE_LOCK On Dim Off SCREEN_BRIGHT_WAKE_LOCK On Bright Off FULL_WAKE_LOCK On Bright Bright 如上表,最高等级的休眠是萤幕,键盘等,cpu都全部休眠。可以设定不同的模式,让其产生不同的休眠,比如让cpu保持执行。 win10系统怎么关闭休眠功能 工具: win10 步骤如下: 1、桌面空白处点选滑鼠右键-个性化 2、选择下方的萤幕保护程式,如下图所示 3、选择更改电源设定,如下图所示 4、选择更改计算机睡眠时间,如下图所示 5、睡眠时间选择从不,如下图所示 6、修改完成后,点选确认按钮! windows7系统怎样关闭休眠功能 在 控制面板 的 电源管理 里面设定修改 如何关闭休眠和系统还原功能 关闭休眠:控制面板-电源选项-休眠,去掉勾即可; 关闭系统还原:右击我的电脑-属性-系统还原,勾选“在所有驱动器上关闭系统还原”即可。 over. 怎样关闭WIN8.1系统的休眠功能 在开始介面下 点选【桌面】或【Win+D】快捷键或单独按【Win】显示桌面。 进入桌面后,在空白处点右键选择【个性化】。 在个性化设定视窗中点选【萤幕保护程式】。 进入【萤幕保护程式设定】对话方块中。点选【更改电源设定】。 在【电源选项】对话方块中,点选【建立电源计划】。 进入【建立电源计划】设定好计划名称后点击【下一步】。 【关闭显示器】这里就是设定自动关闭显示器的时间。根据自己的需求设定。 怎么关闭visit系统中的休眠功能 开始执行powercfg -h off 要是你要开启的话就把off换成on执行 用C盘的磁碟清理功能~~ 或看以下内容~~:tech-ex./learning/swdiy/00448887. 笔记本vista系统休眠功能如何关闭阿。 c盘属性 磁碟清理 然后把休眠档案删除 vista如何关闭休眠功能 开始—所有程式—附件—执行或直接按Win+R键,输入“powercfg -h off”后回车 注意要“以管理员身份执行” 如何让android系统禁止休眠 在开发Android程式时,有时候在程式执行的时候,不能让系统休眠,否则有一些执行会停止,因此我们需要设定禁止休眠,有两种方式:一种是新增许可权,别一种是程式码中设定,建议使用第一种方式,这样,在安装程式的时候会进行提醒: 第一种方式: 在Manifest.xml档案里面用user-permission宣告 名称为:android.permission.WAKE_LOCK 第二种方式: getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 把这段程式码加在setContentView(R.layout.main)之前即可

android 代码录音音量怎么增大?

才做完录音播放的软件 我给你说说我的经验吧。Java code for (int i = 0; i < buffer.length; i++) { v += buffer[i] * buffer[i]; }int value = (int) (Math.abs((int)(v……

关于Android的AudioRecord使用,无法录音,什么原因

录音报错,还是说录音后未保存录音文件?

android怎么区分wlan0,wlan1网卡

没有安装驱动吧?

AndroidTV 开发之 Leanback 库简介

对于 AndroidTV 应用的开发,Google 提供了 Leanback 库的支持。对于某些使用场景,使用 Leanback 能提高开发效率,开发出来的界面也符合 Material Design 规范。 依赖: compile "com.android.support:leanback-v17:+" 或者 compile "com.android.support:leanback-v17:25.1.1" 依赖 Leanback 需指定 minSdkVersion >= 17 ,并且 Leanback 库在 Sdk >= 21 系统中,有 比较好的动画和阴影 等效果。 可以在 Github 上找到官方的使用 demo: ** leanback-showcase ** (这个比较全,推荐参照这个) androidtv-Leanback 对于符合 Leanback 库各种交互流程、页面布局的特定场景,Leanback 能提高开发效率,开发出来的页面符合 Material Design 规范,比较美观。 但是,对于国内的各类定制化需求而言,Leankback 的可定制化程度达不到开发需求。 Android TV application hands on tutorial

去哪下Android Composite ADB Interface 驱动?

直接安装360手机卫士试试

android ADB驱动怎么安装失败

原因:<1>系统已经存在相同的WDF版本引起。解决方案:a.添加一个相关版本的卸载项,以wdf1005版本为例,导入注册表卸载项,然后再安装次即可。b.升级1.9版本的驱动可以解决此问题。<2>系统缺少CryptographicServices服务造成驱动安装失败解决方案:导入服务的注册表键值,然后重启电脑再安装即可。<3>与农行网银U-KEY存在冲突解决方案:如果碰到错误10提示设备有问题的情况,查看下c:WINDOWSsystem32drivers目录下有WdfDynam.sys和WdfLdr.sys。如果存在这两个文件,就是老版本的WDF驱动引起了驱动安装失败。1.先删除WdfDynam的服务,开始-运行-cmd,输入“scdeleteWdfDynam”2.删除c:WINDOWSsystem32drivers目录下WdfDynam.sys和WdfLdr.sys3.重新安装驱动即可。<4>供电不足引起的ADB驱动异常解决方案:接到主机箱的后置USB接口即可。<5>临时目录不可写引起安装中断。解决方案:确保C:windows emp目录可写。<6>Win7系统安装驱动过程提示“系统找不到指定文件”。Win7系统用户在安装adb驱动时提示“系统找不到指定文件”,实际原因是系统在安装adb驱动的时候需要安装系统自带的winusb驱动,而winusb所需的winusb.sys文件是依靠inf文件的“windowscd”字段来复制文件的,有时间系统会不知道“windowscd”的位置就造成在安装过程中缺少winusb.sys文件而安装中止。解决方案:找到winusb的来源路径“c:windowssystem32DriverStoreFileRepositorywinusb.inf_x86_neutral_6cb50ae9f480775b”目录下,把Winusb.sys文件复制到“c:windowsinf”目录下即可,再次安装。

OPPO手机插在电脑Androidadb驱动一直异常

OPPO手机无法连电脑,您可尝试按照以下方法处理:1、进入「设置>关于手机>版本信息」,连续点击版本号,出现“您现在处于开发者模式”后,进入「设置>其他设置>开发者选项>USB调试」,开启USB调试。2、若手机可正常充电,建议重新插拔数据线,“USB用于”选择“传输文件”,若无法识别“USB用于”选择“传输文件”,建议您重启手机和电脑,重新连接尝试。3、建议您更换数据线尝试,同时确保手机和电脑USB端口正常,排除数据线接口或USB接口异常。4、若电脑(非苹果电脑)安装了手机驱动软件,连接电脑时出现新设备提示,一般为驱动问题,建议您重装驱动尝试。若以上方法未能解决您的问题,可前往就近的OPPO客服中心处理,由专业的工程师为您检测。因手机系统版本不同操作路径可能会略有差异,请以手机实际操作界面显示为准。

关于android的adb驱动的问题

下载对应的驱动,让电脑识别手机这个硬件才行。

android开发出现以下错误:EntityUtils.consume(entity1),提示方法consume()不存在???

没导入相应的android类。如果在eclipse下开发,按ctrl+shift+o会自动导入。

可以用css或者sass判断设备是android还是ios么

css只能通过媒体查询判断屏幕大小比例等,而无法判断设备类型。而SASS作为“css预处理器”,显然也不存在这类功能。可以准备两套css,用js通过UA来判断设备类型再动态的加载不同的css。

android 如何用cmd方法查看logcat呀

adb logcat >d:/1.txt 这是将logcat打印到 在1.text(自动创建)中。你打印logcat的东西要在D盘里面

java代码怎么控制android休眠和唤醒?

唤醒:android.intent.action.SCREEN_ON (代码)休眠:android.intent.action.SCREEN_OFF (代码)

android 如何通过触摸屏幕来唤醒屏幕。

有的~~~~~~~~~~~~~~~~~~~~
 首页 上一页  2 3 4 5 6 7 8 9 10 11 12  下一页  尾页