android中 怎样获取服务器上的数据库版本

android中 怎样获取服务器上的数据库版本,第1张

为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表。

后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于 *** 作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。

onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新。

当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。

MODEL 应该就是吧

Logd("build","BOARD:" + BuildBOARD);

Logd("build","BOOTLOADER:" + BuildBOOTLOADER);

Logd("build","BRAND:" + BuildBRAND);

Logd("build","CPU_ABI:" + BuildCPU_ABI);

Logd("build","CPU_ABI2:" + BuildCPU_ABI2);

Logd("build","DEVICE:" + BuildDEVICE);

Logd("build","DISPLAY:" + BuildDISPLAY);

Logd("build","FINGERPRINT:" + BuildFINGERPRINT);

Logd("build","HARDWARE:" + BuildHARDWARE);

Logd("build","HOST:" + BuildHOST);

Logd("build","ID:" + BuildID);

Logd("build","MANUFACTURER:" + BuildMANUFACTURER);

Logd("build","MODEL:" + BuildMODEL);

Logd("build","PRODUCT:" + BuildPRODUCT);

Logd("build","RADIO:" + BuildRADIO);

Logd("build","TAGS:" + BuildTAGS);

Logd("build","TIME:" + BuildTIME);

Logd("build","TYPE:" + BuildTYPE);

Logd("build","UNKNOWN:" + BuildUNKNOWN);

Logd("build","USER:" + BuildUSER);

Logd("build","VERSIONCODENAME:" + BuildVERSIONCODENAME);

Logd("build","VERSIONINCREMENTAL:" + BuildVERSIONINCREMENTAL);

Logd("build","VERSIONRELEASE:" + BuildVERSIONRELEASE);

Logd("build","VERSIONSDK:" + BuildVERSIONSDK);

Logd("build","VERSIONSDK_INT:" + BuildVERSIONSDK_INT);

随着android系统不断升级,android设备的imei号已经越来越难获取了。网上一些推荐会用meid、androidid来代替imei号。但是因为项目推广需要比对渠道那边回传imei号来确认新增。

发现部分机型渠道(eg:快手)可以获取到而我们获取不到,导致无法确认新增。最终在TelephonyManager中找到getDeviceSoftwareVersion()方法。可以变相实现获取imei号(但也会有getDeviceSoftwareVersion获取不到的机型,不过验证渠道那边也获取不到了)。

public static String getIMEI() {

TelephonyManager telephonyManager = (TelephonyManager) BaseApplicationgetAppContext()getSystemService(ContextTELEPHONY_SERVICE);

String imei = null;

if (AndPermissionhasPermissions(BaseApplicationgetAppContext(), ManifestpermissionREAD_PHONE_STATE)) {

try {

if (BuildVERSIONSDK_INT >= BuildVERSION_CODESO) {

imei = telephonyManagergetImei();

if (!TextUtilsisEmpty(imei)) {

return imei;

} else {

String softwareVersion = getDeviceSoftwareVersion();

if (!TextUtilsisEmpty(softwareVersion) && softwareVersionlength() > 14) {

String imeiHead = softwareVersionsubstring(0, 14);

imei = imeiHead + luhn(imeiHead);

return imei;

} else {

return null;

}

}

} else {

return telephonyManagergetDeviceId();

}

} catch (Exception e) {

eprintStackTrace();

}

}

return imei;

}

/

Luhn算法

根据号码获取校验位

@param cardNumber

@return

/

public static int luhn(String cardNumber) {

int totalNumber = 0;

for (int i = cardNumberlength() - 1; i >= 0; i -= 2) {

int tmpNumber = calculate(IntegerparseInt(StringvalueOf(cardNumbercharAt(i))) 2);

if (i == 0) {

totalNumber += tmpNumber;

} else {

totalNumber += tmpNumber + IntegerparseInt(StringvalueOf(cardNumbercharAt(i - 1)));

}

其实是因为getDeviceSoftwareVersion和getImei()拼接规则只有末位两个数不相同,而imei的末位数可以通过luhn算法获取,从而拼接成imei值(自测有效)。

但是毕竟还是有部分机型获取不到imei,可以使用oaid来补充说明。

如果是自己app内部做唯一标识的话可以用meid、androidid或deviceid来代替imei

public static String getUniqueId() {

TelephonyManager telephonyManager = (TelephonyManager) BaseApplicationgetAppContext()getSystemService(ContextTELEPHONY_SERVICE);

if (AndPermissionhasPermissions(BaseApplicationgetAppContext(), ManifestpermissionREAD_PHONE_STATE)) {

if (androidosBuildVERSIONSDK_INT >= BuildVERSION_CODESP) {

android中查看手机系统的OpenGL版本,可以使用如下代码进行查询:

ActivityManager am =(ActivityManager) getSystemService(ContextACTIVITY_SERVICE); 

   ConfigurationInfo info = amgetDeviceConfigurationInfo();     

     inforeqGlEsVersion= 0x00010001  //代表opengles 11   

inforeqGlEsVersion=  0x00020000     //代表opengles 20

ActivityManager是Android框架的一个重要部分,它负责一新ActivityThread进程创建,Activity生命周期的维护。ActivityManagerProxy实现了接口IActivitManager,但并不真正实现这些方法,它只是一个代理类,真正动作的执行为Stub类ActivityManagerService,ActivityManagerService对象只有一个并存在于system_process进程中,ActivityManagerService继承于ActivityManagerNative存根类。

我们自己如何来获取设备名称 呢?答案如下:

在命令行中输入“adb shell”

进入shell之后,再输入“cat /system/buildprop”

其实,设备信息,主要是存放在“/system/buildprop”文件,通过“cat”命令就可以查看了

下面附上ADB命令的详细介绍

adb 介绍

adb的全称为Android Debug Bridge 调试桥,是连接Android手机与PC端的桥梁,通过adb可以管理、 *** 作模拟器和设备,如安装软件、系统升级、运行shell命令等。

管理设备

注:android手机、模拟器统一称为“设备”

adb devices // 显示连接到计算机的设备

adb get-serialno // 获取设备的ID和序列号serialNumber

------------------重启----------------------------------------------

adb reboot // 重启设备

adb reboot bootloader // 重启到bootloader,即刷机模式

adb reboot recovery // 重启到recovery,即恢复模式

------------------发送命令到设备--------------------------------------

adb [-d|-e|-s <serialNumber>] <command>

-d 发送命令给usb连接的设备

-e 发送命令到模拟器设备

-s <serialNumber> 发送命令到指定设备

adb相关

adb kill-server // 终止adb服务进程

adb start-server // 重启adb服务进程

adb root // 已root权限重启adb服务

adb wait-for-device // 在模拟器/设备连接之前把命令转载在adb的命令器中

获取设备硬件信息

adb shell cat /sys/class/net/wlan0/address // 获取mac地址

adb shell cat /proc/cpuinfo // 获取cpu序列号

管理设备app

aapt d badging <apkfile> // 获取apk的packagename 和 classname

------------------安装----------------------------------------------

adb install <apkfile> // 安装apk

adb install -r <apkfile> // 保留数据和缓存文件,重新安装apk,

adb install -s <apkfile> // 安装apk到sd卡

------------------卸载----------------------------------------------

adb uninstall <package> // 卸载app

adb uninstall -k <package> // 卸载app但保留数据和缓存文件

------------------启动app-------------------------------------------

adb shell am start -n <package_name>/<activity_class_name> // 启动应用

------------------查看内存占用----------------------------------------

adb shell top // 查看设备cpu和内存占用情况

adb shell top -m 6 // 查看占用内存前6的app

adb shell top -n 1 // 刷新一次内存信息,然后返回

adb shell procrank // 查询各进程内存使用情况

adb shell kill [pid] // 杀死一个进程

adb shell ps // 查看进程列表

adb shell ps -x [PID] // 查看指定进程状态

adb shell service list // 查看后台services信息

adb shell cat /proc/meminfo // 查看当前内存占用

adb shell cat /proc/iomem // 查看IO内存分区

文件 *** 作

//android中,sdcard代表内置存储,不同系统中tf卡的设备名可能不同,使用查看adb shell ls mnt查看所有存储设备名。

adb remount // 将system分区重新挂载为可读写分区

adb push <local> <remote> // 从本地复制文件到设备

adb pull <remote> <local> // 从设备复制文件到本地

adb shell ls // 列出目录下的文件和文件夹,等同于dos中的dir命令

adb shell cd <folder> // 进入文件夹,等同于dos中的cd 命令

adb shell rename path/oldfilename path/newfilename // 重命名文件

adb shell rm /system/aviapk // 删除system/aviapk

adb shell rm -r <folder> // 删除文件夹及其下面所有文件

adb shell mv path/file newpath/file // 移动文件

adb shell chmod 777 /system/fonts/DroidSansFallbackttf // 设置文件权限

adb shell mkdir path/foldelname // 新建文件夹

adb shell cat <file> // 查看文件内容

publicclass AppInfo {

public String appName="";

public String packageName="";

public String versionName="";

publicint versionCode=0;

public Drawable appIcon=null;

publicvoid print()

{

Logv("app","Name:"+appName+" Package:"+packageName);

Logv("app","Name:"+appName+" versionName:"+versionName);

Logv("app","Name:"+appName+" versionCode:"+versionCode);

}

}

ArrayList<AppInfo> appList = new ArrayList<AppInfo>(); //用来存储获取的应用信息数据

 List<PackageInfo> packages = getPackageManager()getInstalledPackages(0);

for(int i=0;i<packagessize();i++) {

PackageInfo packageInfo = packagesget(i);

AppInfo tmpInfo =new AppInfo();

tmpInfoappName = packageInfoapplicationInfoloadLabel(getPackageManager())toString();

tmpInfopackageName = packageInfopackageName;

tmpInfoversionName = packageInfoversionName;

tmpInfoversionCode = packageInfoversionCode;

tmpInfoappIcon = packageInfoapplicationInfoloadIcon(getPackageManager());

appListadd(tmpInfo);

}

// 这下手机上安装的应用数据都存在appList里了。

最近,因公司产品及客户需要,领导让我研究免存储设备ID,以及给出一个设备ID最佳的方案(可与存储相结合)。在研究过浏览器的fingerprient2js后,颇有心得,并且看网上似乎木有完美的解决方案,于是写了这篇文章,仅供需要的开发者参考。(该算法暂未进行验证,这里先给出一个jar包,后期我会在SDK中加入调查接口,分两个jar包(测试版和正式版),希望开发者能支持测试版,稳定后使用正式版。)

在产品中,首先肯定要尽量避免权限,其次考虑卸载APP后ID不一致的问题,再就是尽量结合存储,降低卸载或重装app时,设备ID改变的概率。最后,设计出合理方案,对造成不利的因素进行列举。

Aandroid_id:

什么是android_id呢?当设备在第一次启动时,系统会随机产生一个64位的数字,然后以16进制的形式保存在设备上,且API提供了获取这一参数的方法:

这就是android_id,当设备重新初始化或者刷机的时候,会被重置。

除此以外,android_id还有其他的bug,比如:

1不同的设备可能会产生相同的android_id。

2有的厂商设备无法获取android_id,会返回null。

3对于CDMA的设备,ANDROID_ID和TelephonyManagergetDeviceId() 的值相同。

4不同的android系统版本稳定性不同。

B硬件序列号(SERIAL)

API给的解释是:

A hardware serial number, if available(一个硬件的序列码,如果有效的话)

so,虽然我没有用几百台手机测试,也能知道这个值有时候是无效的,说的这么隐晦。

C指纹

fingerprint:设备的唯一标识。由设备的多个信息拼接合成。

也是在JavaScript才接触到这个单词”fingerprint“,这个词也很生动,意思是能大概的标识一个设备,像指纹一样,但不排除重复的可能性。

理论上讲用这个属性是可以标识一个设备的,但是其实并不是,两台一摸一样的新手机,这个值相同的可能性是很多的。为了更加进一步的精确,后面还会介绍几个属性,并把几个属性结合在一起,生成一个接近100%的UUID。

Dandroid系统提供了获取android系统版本号,生产厂商,固件版本推出时间的API

Eandroid系统提供了当前android设备是12或24小时制显示时间的API,

Fandroid系统提供了当前android设备的修订版本列表,显示屏,主板等等参数。

G可以允许用户根据需求用自定义字符串去为FP做贡献,比如IP地址等

方案:

在不需要用户权限的前提下,网上最完美的方案是将android_id和硬件序列号,如果其中任意一种失效就使用另外一种。受FingerPrint2js的启发,我看了Android获取系统硬件相关的API,将所有不经常变化且能代表一定用户群体的属性都取出来进行MD5运算,包含但不限于依据中所述的信息。准确性还需进一步验证,但理论上要比FingerPrint2js准确性高,也在网上给出的比较好的方案基础上进一步缩小了FP可能重复的概率。

1第一次进入APP时,获取系统相关配置信息生成FP,存入SP。

2每次访问,先从SP取,没有再通过相关配置信息生成FP,存入SP。

3封装成jar,只给用户暴露出获取ID的接口、传递自定义信息构建FP的接口以及第一次安装时间戳的接口(或设置标签调用的接口)

单纯对于FP而言,有两个主要问题需要解决,一是FP重复的问题,相同配置的新设备重复可能性极大,增多给FP贡献的因素的数量,可以有效降低重复率。二是FP改变的问题,贡献FP的生成因素的其中一个如果改变,FP就会改变。所以如果FP的贡献因素数量过多,导致FP改变的概率也就变大,所以说客户要在两者之间做一个很好的平衡。

对比:

为android FP做贡献的各配置参数:(示例以60的华为荣耀8为例)

1Android_ID:SettingsSystemgetString(contextgetContentResolver(), SettingsSystemANDROID_ID) //低版本稳定,高版本不稳定 示例:295a4fbf716094ee

2BuildSERIAL 设备序列号(有的设备无法获取) 示例:WTK7N16923005607

3BuildFINGERPRINT 设备指纹(同样的新设备该值应该是一样的) 示例:honor/FRD-AL00/HWFRD:60/HUAWEIFRD-AL00/C00B171:user/release-keys

4BuildTIME 固件推出日期 示例:1477442228000

5BuildVERSIONINCREMENTAL 源码控制版本号 示例: C00B171

6BuildgetRadioVersion() 获取无线电固件版本 示例:212100300031,212100300031

7BuildHARDWARE 硬件名称 示例:hi3650

8BuildVERSIONSECURITY_PATCH 用户可见安全补丁level(这里我得到的是日期,可能是补丁修复的时间)示例:2016-10-01

9当前设备是12/24时制:SettingsSystemgetString(contextgetContentResolver(), SettingsSystemTIME_12_24) 示例:null(有的手机可以获取)

10BuildVERSIONSDK_INT SDK版本号 (一般讲是与系统版本号一一对应的) 示例:23

11BuildSUPPORTED_32_BIT_ABIS 支持32位ABIs的列表(数值)示例:[armeabi-v7a,armeabi]

12BuildSUPPORTED_64_BIT_ABIS 支持64位ABIs的列表(数值)示例:[arm64-v8a]

13BuildBOOTLOADER 系统启动程序版本号 示例:unknown

14BuildVERSIONRELEASE 用户可见版本 示例: 60

16BuildBOARD 主板 示例:FRD-AL00

17BuildBRAND 系统定制商 示例:honor

21BuildHOST 示例:huawei-RH2288H-V2-12L

23BuildMANUFACTURER 产品/硬件的制造商 示例:HUAWEI

25BuildPRODUCT 产品的名称 示例:FRD-AL00

26BuildTAGS 描述Build的标签(Comma-separated tags describing the build, like "unsigned,debug") 示例:release-keys

28BuildUSER 描述Build的USER 示例:jslave

31BuildVERSIONBASE_OS 基带版本 The base OS build the product is based on 示例:空值

32自定义字符串或自定义数组

以上就是关于android中 怎样获取服务器上的数据库版本全部的内容,包括:android中 怎样获取服务器上的数据库版本、Android开发中如何获取android系统芯片型号、android imei获取等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9347930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存