Android开发教程之获取标识 ID

合集下载

Android开发教程之获取标识 ID

Android开发教程之获取标识 ID

中国移动互联网研发培训专家
在照着前一章新增了 XML 描述后,再次打开打开 「src/com/demo/android/bmi 」 目录下的 「R.java」档 ,你可以 看到如下的程序码: 代码: /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */
中国移动互联网研发培训专家
存取识别符号 Android: Android:id 属性的内容 XML 描述档与 R.java 档 「R.java 」档案的作用 将字串抽离 XML strings. strings.xml 档案 存取 string 类型


中国移动互联网研发培训专家
package com.demo.android.bmi;
public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; }

中国移动互联网研发培训专家
public static final class id { public static final int height=0x7f050000; public static final int result=0x7f050003; public static final int submit=0x7f050002; public static final int suggest=0x7f050004; public static final int weight=0x7f050001; }

Android设备的ID

Android设备的ID

Android设备的IDAndroid的开发者在⼀些特定情况下都需要知道⼿机中的唯⼀设备ID。

例如,跟踪应⽤程序的安装,⽣成⽤于复制保护的DRM时需要使⽤设备的唯⼀ID。

在本⽂档结尾处提供了作为参考的⽰例代码⽚段。

范围本⽂提供有关如何读取各种Android设备的 ID的介绍,⽤以使⽤标识号。

本⽂假定⽤户已经安装了Android以及开发应⽤程序必要的⼯具。

并且,本⽂假定⽤户已了解Android的基本知识。

简介在搭载Android操作系统的设备中,已经存在好⼏种类型的设备标识号。

先前的所有Android设备都具有电话功能,因此查找每部设备硬件唯⼀的IMEI,MEID,或ESN也很容易。

但仅能使⽤Wifi的设备或⾳乐播放器没有电话硬件,所以没有这种类型的唯⼀标识号。

本⽂阐述了如何读取不同Android设备的标识号。

检索Android设备ID各种⽅式以下是Android设备不同类型的识别设备ID。

· 唯⼀编号(IMEI,MEID,ESN,IMSI)· MAC地址· 序列号· ANDROID_ID唯⼀编号(IMEI,MEID,ESN,IMSI)说明在以前,当Android设备均作为电话使⽤时,寻找唯⼀标识号⽐较简单:()可⽤于找到(取决于⽹络技术)⼿机硬件唯⼀的IMEI,MEID,ESN和IMSI编号。

TelephonyManager.getDeviceIdIMEI,MEID,ESN,IMSI的定义如下:•IMEI(国际移动设备识别码)唯⼀编号,⽤于识别 GSM,WCDMA⼿机以及⼀些卫星电话(移动设备识别码)全球唯⼀编号,⽤于识别CDMA移动电台设备的物理硬件,MEID出现的⽬的是取代ESN号段(电⼦序列号)(电⼦序列号)唯⼀编号,⽤于识别CDMA⼿机(国际移动⽤户识别码)与所有GSM和UMTS⽹络⼿机⽤户相关联的唯⼀识别编号如需要检索设备的ID,在项⽬中要使⽤以下代码:•MEID•ESN•IMSIimport android.telephony.TelephonyManager;import android.content.Context;String imeistring = null;String imsistring = null;{TelephonyManager telephonyManager;telephonyManager =( TelephonyManager )getSystemService( Context.TELEPHONY_SERVICE );/** getDeviceId() function Returns the unique device ID.* for example,the IMEI for GSM and the MEID or ESN for CDMA phones.*/imeistring = telephonyManager.getDeviceId();/** getSubscriberId() function Returns the unique subscriber ID,* for example, the IMSI for a GSM phone.* for example, the IMSI for a GSM phone.*/imsistring = telephonyManager.getSubscriberId();}如要只读取⼿机的状态,则需添加READ_PHONE_STATE许可到AndroidManifest.xml⽂件中。

移动端设备ID标识整理(转)

移动端设备ID标识整理(转)

移动端设备ID标识整理(转)移动设备ID信息在移动端产品的开发中,如何定位⼀台设备,定位⼀个⼈,是⼀个棘⼿的问题,在适配的过程中也会遇到千奇百怪的情况。

本⽂介绍了常⽤的设备ID以及标识设备的⽅法与⼀些常见问题。

移动设备ID可分为三部分:硬件层⾯,系统层⾯,软件层⾯。

系统区别由于IOS系统限制问题,在IOS上可获取的设备ID为IDFV、IDFA,其他设备ID需要越狱⼿机才可获取。

⽽在Android系统中,通常使⽤IMEI、MAC去标识⼀台设备。

但除了这⼏个ID之外,还有MEID、SN码、ANDROID_ID、IMSI、ICCID等ID,各⾃有着⾃⼰的⽤途。

Android系统相关ID信息以下是⼀个Android⼿机正常可获取到的ID信息下⾯逐个介绍这些ID以及⽤途硬件层⾯硬件层⾯的ID标识⼀般⽤于跨应⽤获取设备信息,主要有:标识设备的IMEI、MEID、MAC(⽹卡)及标识SIM卡的IMSI、ICCID。

硬件信息烧制在硬件之中,属于底层信息,不可更改。

但可以通过修改系统调⽤API达到修改获取的⽬的。

IMEI、MEID简介IMEI、MEID都是⽤于标识⼀台物理设备的ID信息。

在Android 8.0以下系统提供的API中,会根据不同条件返回⼆者之⼀的信息。

IMEI:国际移动设备识别码,是区别移动设备的标志,⼀般⽤于标识某⼀台独⽴的设备,双卡双待的⼿机有两个IMEI号。

格式:15位⼗进制数MEID: 同样也是移动设备标识码,但⼀般⽤于CDMA制式的设备上,是ESN码的升级版。

格式:14位⼗六进制数权限获取时,⼆者均需要开启权限:READ_PHONE_STATE。

在Android 6.0以上的版本中,若需要获取该权限的内容,第⼀次启动时系统会给出弹窗提⽰:XXX需要使⽤电话权限...APIAndroid 8.0以上的系统,TelephonyManager提供了两个独⽴的API以获取IMEI和MEID: getImei 、 getMeid 。

android getinstalledpackages参数 -回复

android getinstalledpackages参数 -回复

android getinstalledpackages参数-回复「android getInstalledPackages参数」指的是在Android开发中,使用getInstalledPackages方法获取已安装应用的相关信息时,可以配置的参数。

本文将逐步回答与该参数相关的问题,并深入探讨其用法和实际应用。

1. 什么是android getInstalledPackages方法?getInstalledPackages是Android提供的一个方法,用于获取已安装应用的相关信息。

通过此方法,开发者可以获取应用程序的包名、版本号、权限等属性,以及应用的签名信息等。

2. getInstalledPackages方法的参数有哪些?getInstalledPackages方法包含两个参数:- flags:表示获取已安装应用的额外选项标志。

可以通过该参数指定额外的信息,例如只获取系统应用、只获取用户应用等。

- userId:表示要获取的用户ID。

在多用户设备中,每个用户可能有独立的应用安装。

3. flags参数的用法和常见取值有哪些?在flags参数中,可以使用多个选项标志进行位运算以指定要获取的信息。

常见取值包括:- PackageManager.GET_ACTIVITIES:获取应用所包含的活动。

- PackageManager.GET_META_DATA:获取应用的元数据信息。

- PackageManager.GET_PERMISSIONS:获取应用的权限列表。

- PackageManager.GET_SIGNATURES:获取应用的签名信息。

4. userId参数的用法和常见取值有哪些?userId参数用于指定要获取的用户ID。

在多用户设备中,每个用户都有独立的应用安装。

常见取值包括:- 0:表示获取默认用户的安装应用信息。

- 具体用户ID:表示获取指定用户的安装应用信息。

5. 如何使用getInstalledPackages方法获取已安装应用的信息?使用getInstalledPackages方法可以按照以下步骤获取已安装应用的信息:步骤一:获取PackageManager对象。

getcurrentpackageid使用

getcurrentpackageid使用

主题:getcurrentpackageid使用详解内容:1. getcurrentpackageid是什么?getcurrentpackageid是一种用于获取当前Android应用程序包的标识符的方法。

每个安装在Android设备上的应用程序都有一个唯一的包标识符,它通常被用于识别应用程序的唯一性,并且在开发和测试过程中也经常被用到。

2. getcurrentpackageid的语法和用法在Android应用程序中,可以通过PackageManager类的getcurrentpackageid方法来获取当前包的标识符。

具体的语法如下:String packageName =getPackageManager().getPackageInfo(getPackageName(), 0).packageName;这行代码会返回当前应用程序的包标识符。

3. getcurrentpackageid的返回值是什么?getcurrentpackageid返回的是一个字符串,它代表当前应用程序的包标识符。

这个包标识符通常是应用程序在Play商店中的唯一标识符,也可以用于在设备上定位和识别应用程序。

4. getcurrentpackageid的使用场景getcurrentpackageid通常可以用于以下场景:1. 在应用程序中获取自身的包标识符,以便进行一些与包相关的操作,比如获取应用程序的图标、版本号等信息。

2. 在应用程序中获取自身的包标识符,以便在代码中动态地构建各种资源路径。

3. 在应用程序中获取自身的包标识符,以便进行一些与应用程序身份识别相关的功能,比如检测是否为特定包名的应用程序。

5. getcurrentpackageid的注意事项在使用getcurrentpackageid的时候,有一些需要注意的地方:1. 需要在AndroidManifest.xml文件中正确配置自己的包名,否则getcurrentpackageid可能会返回错误的包标识符。

获取设备信息——获取客户端ip地址和mac地址

获取设备信息——获取客户端ip地址和mac地址

获取设备信息——获取客户端ip地址和mac地址1、获取本地IP(有可能是内⽹IP,192.168.xxx.xxx)/*** 获取本地IP** @return*/public static String getLocalIpAddress() {try {Enumeration<networkinterface> en = NetworkInterface.getNetworkInterfaces();while (en.hasMoreElements()) {NetworkInterface ni = en.nextElement();Enumeration<inetaddress> enIp = ni.getInetAddresses();while (enIp.hasMoreElements()) {InetAddress inet = enIp.nextElement();if (!inet.isLoopbackAddress()&& (inet instanceof Inet4Address)) {return inet.getHostAddress().toString();}}}} catch (SocketException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "0";}</inetaddress></networkinterface>2.获取⽹络ip,⽐上述⽅法更加精确,但是要异步执⾏。

public class GetLocalHostIP implements Callable<String>{private GetLocalHostIP(){super();}public static String getIP(){ExecutorService executorService = Executors.newCachedThreadPool();Future<String> localIP = executorService.submit(new GetLocalHostIP());String ip = null;try {ip = localIP.get();}catch (InterruptedException e){e.printStackTrace();}catch (ExecutionException e){e.printStackTrace();}if(ip == null || ip.startsWith("192.168")){return "10.142.92.242";}else{return ip;}}@Overridepublic String call() throws Exception {URL infoUrl = null;String ipLine = "";try {infoUrl = new URL("");BufferedReader in = new BufferedReader(new InputStreamReader(infoUrl.openStream()));ipLine = in.readLine();} catch (Exception e) {try {infoUrl = new URL("/");BufferedReader in = new BufferedReader(new InputStreamReader(infoUrl.openStream()));ipLine = in.readLine();} catch (Exception e2) {e2.printStackTrace();}}return ipLine;}}上述⽅法可以获取ip,但是获取速度较慢,对⽹速要求较⾼。

Android NFC Tag ID 读取

Android NFC Tag ID 读取

在Activity中获取TAG ID示例代码:Intent intent =this.getIntent();//在activity中获取Intent对象// 确保你的Activity是被扫描到的NFC的Intent对象启动的String intentActionStr = intent.getAction();// 获取到本次启动的actionif (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentActionStr)// NDEF类型|| NfcAdapter.ACTION_TECH_DISCOVERED.equals(intentActionStr)// 其他类型|| NfcAdapter.ACTION_TAG_DISCOVERED.equals(intentActionStr)) {// 未知类型//在intent中读取Tag idbyte[] bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)/*//Android NFC API 10 以后对Tag 对象加入方法getID来获取id,所以还可以// 在intent中通过附加信息读取Tag标签对象,即获取扫描到的标签//然后通过Tag对象读取idTag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//// 获取id数组byte[] bytesId = tag.getId();*/// 字符串idString strId = new String(dataId);}else{//activity不是NFC intent启动的后者收到的intent不是NFC扫描到Tag后传入的}使用主要到的api:intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)// 在intent中读取Tag Id 数组或Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//在intent中读取Tagtag.getId();// 获取Tag Id数组介绍:当NFC检测到NFC标签(Tag)时,同过使用Intent启动适应的Activity。

获取android设备的唯一ID

获取android设备的唯一ID

获取android设备的唯一ID为了对使用我的基础库的客户进行授权需要对每个Android设备进行唯一标识, 一路翻阅下来发现可选择的标识真多, 且每个标识都有些小遗憾。

在Android开发者官方blog上已经有一篇文章对此做了总结(参考链接1), 这里结合自已查询的资料再总结一下, 并给出最终符合要求的解决方案。

1. ANDROID_ID, Secure.ANDROID_ID但是据说Motorola的Droid2犯了个低级错误, 所有的Droid2上使用同一个ANDROID_ID, 即9774D56D682E549C, ANDROID_ID的内部实现是存储在系统的一个SQLite数据库里, root过就有权限修改了2. TelephonyManager.getDeviceId()返回IMEI, MEID 或 ESN, 需要READ_PHONE_STATE权限在过去, 那时所有的Android设备都是电话, 这个方法足够用了, 但是现在连Android电视也有了3. Serial Number, android.os.Build.SERIAL在Android 2.3以后的版本, 非手机的设备必须设置此序列号, 有些手机也设置此序列号4. Mac AddressWiFi或Bluetooth设备的网卡物理地址, 但是并不是所有Android 设备都有WiFi或Bluetooth, 且在WiFi没打开时也不能正常获取5. cpu serialCPU序列号, 通过cat /proc/cpuinfo可以查询, 我的Sumsung能正确查询, 但在有的设备上查询出的序列号是0我的实现是优先使用ANDROID_ID, 再次是imei, 最后是android.os.Build.SERIAL在java层的实现如下(java代码):{% highlight java %} String deviceId; String androidId = Secure.getString(getBaseContext().getContentResolver(), Secure.ANDROID_ID); String imei = ((TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVI CE )).getDeviceId(); String serial = android.os.Build.SERIAL;deviceId = androidId; if (deviceId == null || "9774d56d682e549c".equals(deviceId)) { deviceId = imei; if (deviceId == null || "".equals(deviceId)) { deviceId = serial; if (deviceId == null || deviceId.equals("") || deviceId.equals("unknown")) { deviceId = null; } } }Log.d(TAG, "ANDROID-ID: " + androidId); Log.d(TAG, "imei: " + imei); Log.d(TAG, "SERIAL: " + serial); Log.d(TAG, "final deviceId: " + deviceId); {% endhighlight %}在NDK层的实现就比较困难了, 脱离了java层的Context对象, 就无法获取ANDROID_ID和DeviceID了, 这里我增加了一个接口参数, 在调用时传入一个Context对象进来在NDK层的实现如下(c代码):{% highlight c %} int get_android_device_id(char device_id[64], JNIEnv *jenv, jobject jcontext) { static char _device_id[64]; const char *android_id, *imei, *serial; jstring jandroid_id, jimei, jserial;if (!jenv || !jcontext) {goto end;}/* String androidId =android.provider.Settings.Secure.getString(getApplicationConte xt().getContentResolver(),android.provider.Settings.Secure.ANDROID_ID); *//* String imei = ((android.telephony.TelephonyManager) getApplicationContext().getSystemService(android.content.Cont ext.TELEPHONY_SERVICE)).getDeviceId(); *//* String serial = android.os.Build.SERIAL; */jandroid_id = (*jenv)->CallStaticObjectMethod(jenv,(*jenv)->FindClass(jenv,"android/provider/Settings$Secure"),(*jenv)->NewStringUTF(jenv, "android_id"));jimei = (*jenv)->CallObjectMethod(jenv,(*jenv)->CallObjectMethod(jenv, jcontext, (*jenv)->GetMethodID(jenv, (*jenv)->GetObjectClass(jenv, jcontext), "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"),(*jenv)->NewStringUTF(jenv, "phone")),jimei = (*jenv)->GetMethodID(jenv, (*jenv)->FindClass(jenv, "android/telephony/TelephonyManager"), "getDeviceId", "()Ljava/lang/String;"));jserial = (*jenv)->GetStaticObjectField(jenv,(*jenv)->FindClass(jenv, "android/os/Build"),(*jenv)->GetStaticFieldID(jenv, (*jenv)->FindClass(jenv, "android/os/Build"), "SERIAL", "Ljava/lang/String;"));android_id = jandroid_id ? (*jenv)->GetStringUTFChars(jenv, jandroid_id, NULL) : NULL;imei = jimei ? (*jenv)->GetStringUTFChars(jenv, jimei, NULL) : NULL;serial = jserial ? (*jenv)->GetStringUTFChars(jenv, jserial, NULL) : NULL;if (android_id && strcmp(android_id, "") && strcmp(android_id, "9774d56d682e549c")) {strcpy(_device_id, android_id);} else if (imei && strcmp(imei, "")) {strcpy(_device_id, imei);} else if (serial && strcmp(serial, "")) {strcpy(_device_id, serial);} else {strcpy(_device_id, "");}if (strlen(_device_id) <= 10) {strcpy(_device_id, "");}(*jenv)->ReleaseStringUTFChars(jenv, jandroid_id, android_id);(*jenv)->ReleaseStringUTFChars(jenv, jimei, imei);(*jenv)->ReleaseStringUTFChars(jenv, jserial, serial);end: if (device_id) { strcpy(device_id, _device_id); }return 0;} {% endhighlight %}JNI代码写起来很啰嗦, 写这段代码时对着手册看了半天。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


中国移动互联网研发培训专家
Google 官方文件是这么解释「R.java 」档案的作用 「 档案的作用的: A project's R.java file is an index into all the resources defined in the file. You use this class in your source code as a sort of short-hand way to refer to resources you've included in your project. This is particularly powerful with the code-completion features of IDEs like Eclipse because it lets you quickly and interactively locate the specific reference you're looking for. The important thing to notice for now is the inner class named "layout", and its member field "main". The Eclipse plugin noticed that you added a new XML layout file and then regenerated this R.java file. As you add other resources to your projects you'll see R.java change to keep up.
中国移动互联网研发培训专家
在 上一章谈了 XML 描述档中界面元件的各种 「 android: 」开头的属性。要使用一个界面元件, 第一件事就是定义出界面描述档。大部分的界面元 件 ( 如 LinearLayout 、 TextView) 不需要在程序 中作后续处理,因此可以直接描述。不过对于那些 将在程序中被参考 (reference) 到的界面元件(如 按钮 Button 、文字输入栏位 EditText ),我们 需要透过在 XML 描述档中,定义该界面元件的 「 android:id 」识别符号属性。之后在程序中所 有与这个界面元件有关的操作,都能根据 「 android:id 」 识别符号来在调用这个界面元件。

中国移动互联网研发培训专家
package com.demo.android.bmi;
public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; }

中国移动互联网研发培训专家
代码 : <EditText android:id="@+id/height"
/>
前面章节提过,写作时最好将 XML 描述档属性分 行列出,以易于阅读( 增加可读性) 。而我们的范例 却将 android:id 属性直接摆在 EditText 标签后。 其实这么做同样是基于易于阅读的考量。当然你也 可以将「android:id 」属性分行列出,或是将 「android:id 」属性放在属性列表的 中间或最后 头,这些作法都是允许的,本书中一律使用将 android:id 属性直接摆在界面元件标签后的写法。
中国移动互联网研发培训专家
存取识别符号 Android: Android:id 属性的内容 XML 描述档与 R.java 档 「R.java 」档案的作用 将字串抽离 XML strings. strings.xml 档案 存取 string 类型


ห้องสมุดไป่ตู้
中国移动互联网研发培训专家
Android:id 属性的内容长得比较特别: 属性的内容 代码: @+id/height 「height 」是这个界面元件的 android:id 。以后的程 序中会使用「R.id.height 」来取得这个界面元件。 「@+id 」的意思是我们可以通过这个识别符号来控制 所对应的界面元件,「R 」类别会自动配置一个位址给 这个界面元件。 「R 」类别的内容则可以透过查看 R.java 得知。

中国移动互联网研发培训专家
完整的 strings.xml 档桉 档桉如下: 代码: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">BMI</string> <string name="height"> 身高 (cm)</string> <string name="weight"> 体重 (kg)</string> <string name="bmi_btn"> 计算 BMI 值</string> <string name="bmi_result"> 你的 BMI 值是 </string> </resources>

中国移动互联网研发培训专家
在 Android 系统中,我们使用 XML 来定义 UI 。但是 有些稍微有经验的开发者可能会有疑问: 「用 XML 来描述界面固然方便,但是对于手机程序来 说,直接用 XML 档桉是不是太占空间了?」。 没错,如果 Android 是直接使用 XML 来储存界面描述 到手机上的话,一定会使用比起现在大的多的档桉空间。 解决的方法是Android 并不直接使用 XML 档桉,而是 透过 Android 开发工具,自动将 XML 描述档转换成资 源档桉。一旦应用程序要使用某个界面或是任何种类的 资源( 字串、图片、图示、音效...) ,都使用索引来查 询。

中国移动互联网研发培训专家
public static final class id { public static final int height=0x7f050000; public static final int result=0x7f050003; public static final int submit=0x7f050002; public static final int suggest=0x7f050004; public static final int weight=0x7f050001; }

中国移动互联网研发培训专家
public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; } }

中国移动互联网研发培训专家
public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040000; } } 我们看到在 R.java 档桉中,分别有 attr ( 属性) 、drawable ( 图片、图示) 、id ( 识别符号 ) 、layout ( 界面描述) 、string ( 文字) 这几种资源型态,就 XML 描述档中的 id 来说,开 发工具会根据 XML 描述档中指定的 id ,生成对应的资源,并自动指定一个位址。

中国移动互联网研发培训专家
上面只定义了一个字串「app_name 」,用来表示 应用程序名称(在之后讲解 AndroidManifest.xml 档桉时将会用到)。 我们 看到表示字串的格式为 代码: : <string name=" 识别代号"> 文字叙述 </string> 我们将上一章中的叙述抽取出来,整理进 strings.xml 档桉。

中国移动互联网研发培训专家
当我们在 res 资料夹中新增各种一个 XML 档桉,或是一张 图片时,开发工具会从 res 资料夹中手机集,并将各种资源 整成一个索引,自动产生出 R.java 档。透过这个特性,我 们可以进一步加工我们的 XML 描述档,让界面更易于维护。 开启 res/values/strings.xml ,原始的内容为 代码: <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">BMI</string> </resources>

中国移动互联网研发培训专家
在照着前一章新增了 XML 描述后,再次打开打开 「src/com/demo/android/bmi 」 目录下的 「R.java」档 ,你可以 看到如下的程序码: 代码: /* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */
相关文档
最新文档