通过PHP怎样取到android系统下apk应用的包名,版本号等信息

通过PHP怎样取到android系统下apk应用的包名,版本号等信息,第1张

应用场景:1、在界面中显示应用程序的版本号;2、用户启动该应用,后台判断该应用是否是最新版本。上述情景都需要在程序中自动获取到应用的版本号。思路简介:在Android中,应用程序的版本号是在AndroidManifestxml文件中进行配置的

    Android开发的小伙伴们肯定会用到百度地图或者高德地图的API,都需要输入开发版的SHA1和发布版的SHA1,我第一次接触SHA1的时候,通过百度地图给的教程通过命令窗口顺利获取SHA1,由于开发版SHA1不是必填项,所以直接将获取的SHA1复制到了发布版SHA1的输入框,like this。

      当时并不知道通过这种方式获取的SHA1其实是开发版,也就是debug版,再输入包名,获取应用AK后继续开发功能,貌似一切正常,但是当用正式版的签名文件签名打包后,百度地图无法获取定位信息,提示应用AK出错,检查百度获取的AK,没有问题呀,百思不得其解,坐下来静静的抽了根烟,来了段freestyle,想想,百度既然把SHA1分为开发版和发布版,一定是有原因的,经过查阅资料,加上自己的猜想,SHA1和签名文件有关,同一台电脑通过命令窗口获取的SHA1是一样的,因为开发过程中是用同一个debug签名文件签名打包的,当正式发布的时候,我们用的是正式的签名文件打包的,因为不同签名文件的SHA1是不一样的,所以当正式签名打包后,用的还是开发版SHA1申请的百度应用AK,所以,问题就出现了。

      通过网络搜索,不难找到获取开发版和发布版SHA1的教程,大多都是通过命令窗口获取的,对于一些入门开发者,通过命令窗口获取SHA1,稍微有点麻烦,所以,闲暇时间,自己写了一个获取SHA1的小demo,首先安装debug版apk或者正式版apk,主页面获取手机安装的第三方应用APP,点击需要获取SHA1的APP条目,d出该应用的基本信息和debug版SHA1或者正式版SHA1,SHA1的版本取决于apk是用debug版签名打包的还是正式版签名打包的,然后点击右上角的分享,分享到电脑,perfect。

      本人菜鸟一枚,有什么解释不对还望各位大神指正,如果这个方法没有问题,希望帮助更多的Android开发者,下面附上该demo的

GitHub地址: GetSHA1

APK地址: 网盘地址

安卓应用账户信息在屏幕下方

安卓应用账户信息在屏幕下方,具体位置可能因设备型号和版本而异。您可以通过点击手机桌面上的"设置"图标,打开"手机屏幕下方"界面,然后就可以看到安卓应用账户信息了。

应用的名称不是文件名得来的。是通过packagemanager接口获取。

final PackageManager pm = contextgetPackageManager();

ApplicationInfo ai;

try {

ai = pmgetApplicationInfo(packageName, 0);

} catch (final NameNotFoundException e) {

ai = null;

}

final String applicationName = (String) (ai != null pmgetApplicationLabel(ai) : "(unknown)");

在用户安装完之后,可以通过监听广播,获取安装的应用名称信息。

1获取系统的可用内存和总内存。

获取系统内存中应用的信息,需要用到ActivityManager这个类,然而当你用这个类拿数据的时候你会发现,拿到的数据不正确。用这个类的API获取系统的总内存和可用内存会出现数据不正确的情况。除了这个类,Android手机中有文件描述了这些信息——/proc/meminfo。meminfo文件中详细的记录了安卓手机的一些数据,包括可用内存和总内存。附上代码:

public static long getTotalMemSize() {

long size=0;

File file = new File("/proc/meminfo");

try {

BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

String memInfo = bufferreadLine();

int startIndex = memInfoindexOf(":");

int endIndex = memInfoindexOf("k");

memInfo = memInfosubstring(startIndex + 1, endIndex)trim();

size = LongparseLong(memInfo);

size = 1024;

bufferclose();

} catch (javaioIOException e) {

eprintStackTrace();

}

return size;

}

public static long getAviableMemSize() {

long size=0;

File file = new File("/proc/meminfo");

try {

BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

String memInfos=new String();

int i=0;

while ((memInfos=bufferreadLine())!=null){

i++;

if (i==2){

memInfo = memInfos;

}

}

int startIndex = memInfoindexOf(":");

int endIndex = memInfoindexOf("k");

memInfo = memInfosubstring(startIndex + 1, endIndex)trim();

size = LongparseLong(memInfo);

size = 1024;

bufferclose();

} catch (javaioIOException e) {

eprintStackTrace();

}

return size;

}

*** 作很简单分别是读取第一行的数据和第二行的数据,将字符串分去出,将所得值乘以1024变为byte类型。

2获取内存中运行应用的信息

首先,自然要有一个Bean文件用于存储这些信息,之后通过ActivityManager的getRunningAppProcesses()方法得到一个RunningAppProcessInfo的List。便利这个List去除我们想要的数据,存在我们的Bean文件夹中。

public static List<TaskBean> getAllTask() {

List<TaskBean>taskList=new ArrayList<>();

List<ActivityManagerRunningAppProcessInfo>runList=UIUtilsgetActManager()getRunningAppProcesses();

try {

for (ActivityManagerRunningAppProcessInfo r:runList) {

TaskBean taskBean = new TaskBean();

String processName = rprocessName;

taskBeansetPackageName(processName);

PackageInfo packageInfo = UIUtilsgetPacManager()getPackageInfo(processName, 0);

taskBeansetIcon(packageInfoapplicationInfoloadIcon(UIUtilsgetPacManager()));

taskBeansetName(packageInfoapplicationInfoloadLabel(UIUtilsgetPacManager())toString());

DebugMemoryInfo[] processInfo=UIUtilsgetActManager()getProcessMemoryInfo(new int[]{rpid});

taskBeansetMemSize(processInfo[0]getTotalPrivateDirty()1024);

if ((packageInfoapplicationInfoflags&ApplicationInfoFLAG_SYSTEM)!=0){

taskBeansetSystem(true);

}else {

taskBeansetUser(true);

}

if (taskList != null) {

taskListadd(taskBean);

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

if (taskListget(i)getPackageName()equals(ConstantsPACKAGE_INFO)){

taskListremove(i);

}

}

}

}

} catch (PackageManagerNameNotFoundException e) {

eprintStackTrace();

}

return taskList;

}

好了,大功告成。当你开开心心的拿到手机上调试的时候你会发现,一个数据都没有。原来,在Android50之后,谷歌处于完全考虑已经弃用了通过如上方法拿到进程中的信息。那么又应该怎么做呢?

public static List<TaskBean> getTaskInfos() {

List<AndroidAppProcess> processInfos = ProcessManagergetRunningAppProcesses();

List<TaskBean> taskinfos = new ArrayList<TaskBean>();

// 遍历运行的程序,并且获取其中的信息

for (AndroidAppProcess processInfo : processInfos) {

TaskBean taskinfo = new TaskBean();

// 应用程序的包名

String packname = processInfoname;

taskinfosetPackageName(packname);

// 湖区应用程序的内存 信息

androidosDebugMemoryInfo[] memoryInfos = UIUtilsgetActManager()

getProcessMemoryInfo(new int[] { processInfopid });

long memsize = memoryInfos[0]getTotalPrivateDirty() 1024L;

taskinfosetMemSize(memsize);

taskinfosetPackageName(processInfogetPackageName());

try {

// 获取应用程序信息

ApplicationInfo applicationInfo = UIUtilsgetPacManager()getApplicationInfo(

packname, 0);

Drawable icon = applicationInfoloadIcon(UIUtilsgetPacManager());

taskinfosetIcon(icon);

String name = applicationInfoloadLabel(UIUtilsgetPacManager())toString();

taskinfosetName(name);

if ((applicationInfoflags & ApplicationInfoFLAG_SYSTEM) == 0) {

// 用户进程

taskinfosetUser(true);

} else {

// 系统进程

taskinfosetSystem(true);

}

} catch (PackageManagerNameNotFoundException e) {

// TODO Auto-generated catch block

eprintStackTrace();

// 系统内核进程 没有名称

taskinfosetName(packname);

Drawable icon = UIUtilsgetContext()getResources()getDrawable(

Rdrawableic_launcher);

taskinfosetIcon(icon);

}

if (taskinfo != null) {

taskinfosadd(taskinfo);

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

if (taskinfosget(i)getPackageName()equals(ConstantsPACKAGE_INFO)){

taskinfosremove(i);

}

}

}

}

return taskinfos;

}

好了,接下来只需要判断安装的版本就可以了:

int sysVersion = IntegerparseInt(BuildVERSIONSDK);

taskList = sysVersion > 21 TaskManagerEnginegetTaskInfos() : TaskManagerEnginegetAllTask();

好了,大功告成。数据就能正常拿到了。

可以参考如下的代码片段:

// 以下是获得版本信息的工具方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//版本名

public static String getVersionName(Context context) {

return getPackageInfo(context)versionName;

}

//版本号

public static int getVersionCode(Context context) {

return getPackageInfo(context)versionCode;

}

private static PackageInfo getPackageInfo(Context context) {

PackageInfo pi = null;

try {

PackageManager pm = contextgetPackageManager();

pi = pmgetPackageInfo(contextgetPackageName(),

PackageManagerGET_CONFIGURATIONS);

return pi;

} catch (Exception e) {

eprintStackTrace();

}

return pi;

}

在Android中,应用程序的版本号是在AndroidManifestxml文件中进行配置的,而PackageInfo类则封装了从该配置文件中获取的所有信息,描述了包内容的整体信息,因此,可以使用PackageInfo对象的versionName属性获取应用的版本号。

要怎么获取PackageInfo对象呢?可以通过PackageManager对象来获取。PackageManager是一个检索当前已安装在设备上的相关应用程序包的各种信息的类。PackageManager对象中的getPackageInfo方法可以获取PackageInfo对象,该方法需要传递两个参数:应用包名和条件。通常情况下,应用程序的包名可以通过Activity或Context(Activity继承自Context)的getPackageName()方法获取,而添加可以有很多设置,通常设置为0。

最后是PackageManager对象的获取,Context对象提供了getPackageManager()方法来获取该对象。

以上就是关于通过PHP怎样取到android系统下apk应用的包名,版本号等信息全部的内容,包括:通过PHP怎样取到android系统下apk应用的包名,版本号等信息、Android获取应用SHA1的APP、安卓应用账户信息在什么地方等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10136340.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存