我的编程空间,编程开发者的网络收藏夹
学习永远不晚

安卓唯一标识:IMEI,MEID,MAC地址,Android_id,UUID,OAID

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

安卓唯一标识:IMEI,MEID,MAC地址,Android_id,UUID,OAID

目录

IMEI:

MEID:

MAC地址:

Android_id:

UUID:

OAID:


安卓设备的唯一标识,获取的目的在于数据统计,广告归因分析等用途。常用作唯一标识的有IMEI,MEID,MAC地址,Android_id,UUID,OAID等。

IMEI:

国际移动设备识别码(International Mobile Equipment Identity,IMEI),即通常所说的手机序列号、手机“串号”,用于在移动电话网络中识别每一部独立的手机等移动通信设备,相当于移动电话的身份证。序列号共有15~17位数字,前8位(TAC)是型号核准号码(早期为6位),是区分手机品牌和型号的编码。接着2位(FAC)是最后装配号(仅在早期机型中存在),代表最终装配地代码。后6位(SNR)是串号,代表生产顺序号。国际移动设备识别码一般贴于机身背面与外包装上,同时也存在于手机存储器中,通过在手机拨号键盘中输入*#06#即可查询

需要android.permission.READ_PHONE_STATE
安卓8.0以前,都是通过getDeviceId来获取,在8.0 API=26时废弃
改用getImei来获取

高于安卓10,不能获取IEMI,会报安全异常,程序闪退。

获取代码如下:

    //需要android.permission.READ_PHONE_STATE    //安卓8.0以前,都是通过getDeviceId来获取,在8.0 API=26时废弃    //改用getImei和getMeid来获取    public  void getUniqueId(Context context) {        TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){            if (ContextCompat.checkSelfPermission(context,Manifest.permission.READ_PHONE_STATE)==PackageManager.PERMISSION_GRANTED){                //8.0以后,区分IMEI和MEID                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {                    Log.d(TAG,"getImei:"+manager.getImei());                    Log.d(TAG,"getMeid:"+manager.getMeid());                }else{//6.0-8.0:不区分IMEI和MEID,在安卓8.0废弃                    Log.d(TAG,"getDeviceId:"+manager.getDeviceId());                }            }else{                ActivityCompat.requestPermissions(MainActivity.this, new String[]{                        Manifest.permission.READ_PHONE_STATE                }, 1);            }        }else{//6.0以前            //安卓8.0以前,用getDeviceId()获取唯一标识            //例如,GSM的IMEI和CDMA电话的MEID或ESN。如果设备ID不可用,则返回null            Log.d(TAG,"getDeviceId:"+manager.getDeviceId());        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if(requestCode==1){            if(grantResults[0]==PackageManager.PERMISSION_GRANTED){                TelephonyManager manager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);                //8.0以后,区分IMEI和MEID                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {                    Log.d(TAG,"getImei:"+manager.getImei());                    Log.d(TAG,"getMeid:"+manager.getMeid());                }else{//6.0-8.0:不区分IMEI和MEID,在安卓8.0废弃                    Log.d(TAG,"getDeviceId:"+manager.getDeviceId());                }            }else{                //用户拒绝了这个权限            }        }    }

MEID:

MEID 移动设备识别码(Mobile Equipment Identifier)是CDMA手机的身份识别码,也是每台CDMA手机或通讯平板唯一的识别码。通过这个识别码,网络端可以对该手机进行跟踪和监管。

CDMA作为一项新兴技术,CDMA2000正迅速风靡全球并已占据20%的无线市场。截止2012年,全球CDMA2000用户已超过2.56亿,遍布70个国家的 156家运营商已经商用3G CDMA业务。包含高通授权LICENSE的安可信通信技术有限公司在内全球有数十家OEM厂商推出EVDO移动智能终端·2002年,高通公司芯片销售创历史佳绩;1994年至今,高通公司已向全球包括中国在内的众多制造商提供了累计超过75亿多枚芯片

需要android.permission.READ_PHONE_STATE
安卓8.0以前,都是通过getDeviceId来获取,在8.0 API=26时废弃
改用getMeid来获取

高于安卓10,不能获取MEID,会报安全异常,程序闪退。

获取代码:

    //需要android.permission.READ_PHONE_STATE    //安卓8.0以前,都是通过getDeviceId来获取,在8.0 API=26时废弃    //改用getImei和getMeid来获取    public  void getUniqueId(Context context) {        TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){            if (ContextCompat.checkSelfPermission(context,Manifest.permission.READ_PHONE_STATE)==PackageManager.PERMISSION_GRANTED){                //8.0以后,区分IMEI和MEID                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {                    Log.d(TAG,"getImei:"+manager.getImei());                    Log.d(TAG,"getMeid:"+manager.getMeid());                }else{//6.0-8.0:不区分IMEI和MEID,在安卓8.0废弃                    Log.d(TAG,"getDeviceId:"+manager.getDeviceId());                }            }else{                ActivityCompat.requestPermissions(MainActivity.this, new String[]{                        Manifest.permission.READ_PHONE_STATE                }, 1);            }        }else{//6.0以前            //安卓8.0以前,用getDeviceId()获取唯一标识            //例如,GSM的IMEI和CDMA电话的MEID或ESN。如果设备ID不可用,则返回null            Log.d(TAG,"getDeviceId:"+manager.getDeviceId());        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if(requestCode==1){            if(grantResults[0]==PackageManager.PERMISSION_GRANTED){                TelephonyManager manager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);                //8.0以后,区分IMEI和MEID                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {                    Log.d(TAG,"getImei:"+manager.getImei());                    Log.d(TAG,"getMeid:"+manager.getMeid());                }else{//6.0-8.0:不区分IMEI和MEID,在安卓8.0废弃                    Log.d(TAG,"getDeviceId:"+manager.getDeviceId());                }            }else{                //用户拒绝了这个权限            }        }    }

关于IMEI和MEID:

我的理解是MEID和手机通信芯片有关系,一般用作智能芯片手机,而IMEI和手机卡槽有关系,包含老式手机和智能手机

MAC地址:

MAC地址(英语:Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。MAC位址由数据链路层则负责 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并会有一个唯一的MAC地址。

MAC地址的长度为48位(6个字节),通常表示为12个16进制数,如:00-16-EA-AE-3C-40就是一个MAC地址,其中前3个字节,16进制数00-16-EA代表网络硬件制造商的编号,它由IEEE(电气与电子工程师协会)分配,而后3个字节,16进制数AE-3C-40代表该制造商所制造的某个网络产品(如网卡)的系列号。只要不更改自己的MAC地址,MAC地址在世界是唯一的。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性。

安卓中:通过WifiManager获取mac地址,需要如下权限

            

MAC地址只有在设备联入网络后,才会生成,对于无网络的设备,获取的值可能为null或:"02:00:00:00:00:00"。

安卓13的模拟器,用busybox ipconfig 会报异常:

java.io.IOException: Cannot run program "busybox": error=13, Permission denied

获取代码如下:

package com.tiancity.dom.myapplication.utils;import android.content.Context;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.os.Build;import android.text.TextUtils;import android.util.Log;import android.widget.Toast;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.util.Enumeration;public class PhoneUtils {    public static String getMac(Context context) {        String strMac;        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {            strMac = getLocalMacAddressFromWifiInfo(context);            Log.e("=====", "6.0以下 strMac = " + strMac);            Toast.makeText(context, "6.0以下", Toast.LENGTH_SHORT).show();            return strMac;        } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {            strMac = getMacAddress();            Log.e("=====", "6.0以上7.0以下 strMac = " + strMac);            Toast.makeText(context, "6.0以上7.0以下", Toast.LENGTH_SHORT).show();            return strMac;        } else {            Log.e("=====", "7.0以上");            if (!TextUtils.isEmpty(getMacAddress())) {                strMac = getMacAddress();                Log.e("=====", "7.0以上1 strMac = " + strMac);                Toast.makeText(context, "7.0以上1", Toast.LENGTH_SHORT).show();                return strMac;            } else if (!TextUtils.isEmpty(getMachineHardwareAddress())) {                strMac = getMachineHardwareAddress();                Log.e("=====", "7.0以上2 strMac = " + strMac);                Toast.makeText(context, "7.0以上2", Toast.LENGTH_SHORT).show();                return strMac;            } else {                strMac = getLocalMacAddressFromBusybox();                Log.e("=====", "7.0以上3 strMac = " + strMac);                Toast.makeText(context, "7.0以上3", Toast.LENGTH_SHORT).show();                return strMac;            }        }    }        private static String getLocalMacAddressFromWifiInfo(Context context) {        WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);        WifiInfo winfo = wifi.getConnectionInfo();        String mac = winfo.getMacAddress();        return mac;    }        private static String getMacAddress() {        String strMacAddr = null;        try {            // 获得IpD地址            InetAddress ip = getLocalInetAddress();            byte[] b = NetworkInterface.getByInetAddress(ip)                    .getHardwareAddress();            StringBuffer buffer = new StringBuffer();            for (int i = 0; i < b.length; i++) {                if (i != 0) {                    buffer.append(':');                }                String str = Integer.toHexString(b[i] & 0xFF);                buffer.append(str.length() == 1 ? 0 + str : str);            }            strMacAddr = buffer.toString().toUpperCase();        } catch (Exception e) {        }        return strMacAddr;    }        private static InetAddress getLocalInetAddress() {        InetAddress ip = null;        try {            // 列举            Enumeration en_netInterface = NetworkInterface                    .getNetworkInterfaces();            while (en_netInterface.hasMoreElements()) {// 是否还有元素                NetworkInterface ni = (NetworkInterface) en_netInterface                        .nextElement();// 得到下一个元素                Enumeration en_ip = ni.getInetAddresses();// 得到一个ip地址的列举                while (en_ip.hasMoreElements()) {                    ip = en_ip.nextElement();                    if (!ip.isLoopbackAddress()&& ip.getHostAddress().indexOf(":") == -1)                        break;                    else                        ip = null;                }                if (ip != null) {                    break;                }            }        } catch (SocketException e) {            e.printStackTrace();        }        return ip;    }        private static String getLocalIpAddress() {        try {            for (Enumeration en = NetworkInterface                    .getNetworkInterfaces(); en.hasMoreElements(); ) {                NetworkInterface intf = en.nextElement();                for (Enumeration enumIpAddr = intf                        .getInetAddresses(); enumIpAddr.hasMoreElements(); ) {                    InetAddress inetAddress = enumIpAddr.nextElement();                    if (!inetAddress.isLoopbackAddress()) {                        return inetAddress.getHostAddress().toString();                    }                }            }        } catch (SocketException ex) {            ex.printStackTrace();        }        return null;    }            private static String getMachineHardwareAddress() {        Enumeration interfaces = null;        try {            interfaces = NetworkInterface.getNetworkInterfaces();        } catch (SocketException e) {            e.printStackTrace();        }        String hardWareAddress = null;        NetworkInterface iF = null;        if (interfaces == null) {            return null;        }        while (interfaces.hasMoreElements()) {            iF = interfaces.nextElement();            try {                hardWareAddress = bytesToString(iF.getHardwareAddress());                if (hardWareAddress != null)                    break;            } catch (SocketException e) {                e.printStackTrace();            }        }        return hardWareAddress;    }        private static String bytesToString(byte[] bytes) {        if (bytes == null || bytes.length == 0) {            return null;        }        StringBuilder buf = new StringBuilder();        for (byte b : bytes) {            buf.append(String.format("%02X:", b));        }        if (buf.length() > 0) {            buf.deleteCharAt(buf.length() - 1);        }        return buf.toString();    }        private static String getLocalMacAddressFromBusybox() {        String result = "";        String Mac = "";        result = callCmd("busybox ifconfig", "HWaddr");        // 如果返回的result == null,则说明网络不可取        if (result == null) {            return "网络异常";        }        // 对该行数据进行解析        // 例如:eth0 Link encap:Ethernet HWaddr 00:16:E8:3E:DF:67        if (result.length() > 0 && result.contains("HWaddr") == true) {            Mac = result.substring(result.indexOf("HWaddr") + 6,                    result.length() - 1);            result = Mac;        }        return result;    }    private static String callCmd(String cmd, String filter) {        String result = "";        String line = "";        try {            Process proc = Runtime.getRuntime().exec(cmd);            InputStreamReader is = new InputStreamReader(proc.getInputStream());            BufferedReader br = new BufferedReader(is);            while ((line = br.readLine()) != null                    && line.contains(filter) == false) {                result += line;            }            result = line;        } catch (Exception e) {            e.printStackTrace();        }        return result;    }}

Android_id:

Android 8.0(API 26级)和更高版本的平台上,64位数字(表示为十六进制字符串),对于应用程序签名密钥、用户和设备的每个组合都是唯一的。ANDROID_ID的值由签名密钥和用户限定范围。如果在设备上执行出厂重置或APK签名密钥发生更改,则该值可能会更改。有关平台如何在ANDROID 8.0(API级别26)及更高版本中处理ANDROID_ID的更多信息,请参阅ANDROID 8.0-行为更改。

注意:对于在将设备更新为Android 8.0(API级别26)或更高版本之前安装的应用程序,如果卸载应用程序,然后在OTA(更新或刷机)之后重新安装,则Android_ID的值会更改。为了在OTA到Android 8.0或更高版本后在卸载过程中保持价值,开发人员可以使用Key/Value 备份。

低于Android 8.0(API 26级)的平台版本中,用户首次设置设备时随机生成的64位数字(表示为十六进制字符串),在用户设备的使用寿命内应保持不变。在具有多个用户的设备上,每个用户都显示为一个完全独立的设备,因此ANDROID_ID值对每个用户都是唯一的

注意:如果调用方是即时应用程序,则ID的范围为即时应用程序的范围,它是在首次安装即时应用程序时生成的,如果用户清除即时应用程序则会重置。

Android ID的生成是基于设备的硬件信息和操作系统的版本号等,因此它在同一台设备上是固定的,但是在不同的设备上是不同的。Android ID是非常重要的,因为它可以用于许多方面,如广告跟踪、应用程序授权和设备管理等

在Android系统中,Android ID是在设备首次启动时生成的。它存储在设备的/data/data/com.android.providers.settings/databases/settings.db数据库中的secure表中。在设备首次启动时,系统会检查secure表是否存在一个名为android_id的条目,如果不存在,则会生成一个唯一的Android ID,并将其插入到secure表中。如果设备被恢复出厂设置,则会重新生成一个新的Android ID。

虽然Android ID是唯一的,但是它也有一些限制。首先,它不是100%可靠的,因为它可以被某些应用程序修改或篡改。其次,如果用户重置设备,Android ID也会被重置。此外,如果用户刷机或者更换了ROM,Android ID也会被重置

获取代码如下:

    //在 Android 8.0(API 级别 26)及更高版本中,SSAID(AndroidID) 提供了一个在由同一开发者签名密钥签名的应用之间通用的标识符。    // 借助它,您可以在这些应用之间共享状态,而无需要求用户登录帐号。    //当设备恢复出厂设置,或者Root过的话,OTA升级系统,该值会被改变    public static  void getAndroidId(Context context){        String androidId = Settings.Secure.getString(context.getApplicationContext().getContentResolver(),                Settings.Secure.ANDROID_ID);        Log.d(TAG, "androidId:" + androidId);    }

265682bdb810859d

ae0b78ec5dd64de6

UUID:

UUID(Universally Unique Identifier)全局唯一标识符,定义为一个字符串主键,采用32位数字组成,编码采用16进制,定义了在时间和空间都完全唯一的系统信息。是国际标准化组织(ISO)提出的一个概念。

UUID是一个128比特的数值,这个数值可以通过一定的算法计算出来。UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识。

UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的

UUID的编码规则:

1)1~8位采用系统时间,在系统时间上精确到毫秒级保证时间上的唯一性;

2)9~16位采用底层的IP地址,在服务器集群中的唯一性;

3)17~24位采用当前对象的HashCode值,在一个内部对象上的唯一性;

4)25~32位采用调用方法的一个随机数,在一个对象内的毫秒级的唯一性。

通过以上4种策略可以保证唯一性

在安卓中,可以通过import java.util.UUID;JDK提供的类来获取。

获取代码如下:

    //在大多数非广告用例中,可用于跟踪已注销用户的偏好设置,这是建议的解决方案    public static void getUUID(){        String uniqueID = UUID.randomUUID().toString();        Log.d(TAG, "UUID:" + uniqueID);    }

72a89a1c-9dca-4a70-8adb-401578da2c68

28fb1704-6ee8-422e-b190-3ae6265e7baa

OAID:

OAID(Open Anonymous Device Identifier),开放匿名设备ID。

是中国移动安全联盟(MSA)发起并制定标准的安卓端用户识别ID,用以取代目前在安卓端普遍使用的IMEI,以进一步保护用户隐私。与IDFA类似,OAID也不是真正意义上的硬件ID,用户可以关闭或重置该ID。包括华为、小米等多家手机厂商,都是支持该ID。

它的出现源于自Android10后,谷歌为保护个人信息安全,限制了IMEI,MAC地址等设备信息的获取,因此,为了满足向用户提供个性化广告,用户统计,同时三方监测平台也可以向广告主提供转化归因分析,所以信通院联合各手机厂商成立MSA制定并发布了OAID。

关于OAID的官方介绍:移动安全工作委员会

以OPPO为例:

OPPO关于OAID的说明:

为进一步提升用户隐私的保护能力,响应信通院持续优化OAID管控的要求,OPPO实现了OAID应用级管控能力。
1)未管控之前,每个应用无需任何权限即可获取OAID;
2)管控后,用户可手动开启/关闭某个应用的OAID权限开关;开关关闭后,该应用获取的OAID为默认“00…00”(64个0);
3)当用户关闭某个应用的OAID权限时,应用可以弹权限框提示用户允许/拒绝开启OAID权限;该弹框最多显示一次((应用未卸载情况下,卸载后会重置);

华为关于OAID的说明:

OAID(Open Advertising Identifier):广告标识符,是华为提供的一种非永久性设备标识符,它是基于华为自有算法生成的类UUID(Universally Unique Identifier)标识符。

OAID举例:1fe9a970-efbb-29e0-0bdd-f5dbbf751ab5。

OAID的特性:

  • OAID与华为帐号ID无关,不与华为帐号ID绑定。
  • OAID是设备级标识符,同一台设备上不同的App获取到的OAID值一样。
  • OAID的获取受应用的跟踪开关影响:当应用的跟踪开关开启时,该应用可获取到OAID;当应用的跟踪开关关闭时,该应用仅能获取全0的OAID。

华为OAID:文档中心

OPPO OAID:OPPO 开放平台-OPPO开发者服务中心

小米OAID:小米开放平台

来源地址:https://blog.csdn.net/qq_34123324/article/details/131433883

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

安卓唯一标识:IMEI,MEID,MAC地址,Android_id,UUID,OAID

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录