GVKun编程网logo

更改android中的包管理器应用程序信息元数据(apk包管理器)

6

针对更改android中的包管理器应用程序信息元数据和apk包管理器这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android11ScopedStorage权限(如何管理文件管理器应用程

针对更改android中的包管理器应用程序信息元数据apk包管理器这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Android 11 Scoped Storage 权限(如何管理文件管理器应用程序,文件管理器应用程序怎么样)、Android 5.0 6.0 7.0 8.0 9.0 10.0 适配文件管理器应用安装、Android ApplicationInfo 应用程序信息的详解、android – 从包管理器中检索应用程序信息等相关知识,希望可以帮助到你。

本文目录一览:

更改android中的包管理器应用程序信息元数据(apk包管理器)

更改android中的包管理器应用程序信息元数据(apk包管理器)

我想更改 AndroidManifest.xml文件中元数据的值:

我使用以下代码:

ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
                activity.getPackageName(),PackageManager.GET_Meta_DATA);
applicationInfo.MetaData.putString("dataname","2");

但是applicationInfo没有保存到包管理器中.之后调用packageManager.getApplicationInfo()时,我得到旧值.

我没有看到setApplicationInfo()方法,我该怎么办?

谢谢

解决方法

AFAIK,getApplicationInfo返回的applicationInfo始终是副本,并且没有用于更改元数据的api

Android 11 Scoped Storage 权限(如何管理文件管理器应用程序,文件管理器应用程序怎么样)

Android 11 Scoped Storage 权限(如何管理文件管理器应用程序,文件管理器应用程序怎么样)

如何解决Android 11 Scoped Storage 权限(如何管理文件管理器应用程序,文件管理器应用程序怎么样)?

从android 11我们知道写外部存储权限将不起作用,我们无法访问外部存储根路径的其他目录,但我的问题是文件管理器应用程序,如果我的应用程序是文件管理器,那该怎么办我像以前一样管理所有文件操作。例如,创建新文件或文件夹,在这里我们无法获得外部存储的根路径访问权限,那么如何管理文件管理器操作,我在开发者站点和某处阅读了他们的选项来处理该特定应用程序,Google 也提供某种方式来管理该应用程序,但我如何找不到解决方案,如果有人知道,请帮我解决这个问题。

解决方法

从android 11我们知道写外部存储权限将不起作用,我们无法访问外部存储根路径的其他目录,

请求写入外部存储没有意义,因为它已经隐式授予您的应用。

您可以从 getExternalStorageDirectory() 和 getExternalStoragePublicDirectory() 访问所有路径。

并在 getExternalStoragePublicDirectory() 中创建子目录和文件

Android 5.0 6.0 7.0 8.0 9.0 10.0 适配文件管理器应用安装

Android 5.0 6.0 7.0 8.0 9.0 10.0 适配文件管理器应用安装

安装应用一般需要添加的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.REPLACE_EXISTING_PACKAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

在AndroidManifest.xml文件中application中添加如下权限,该权限适用于Android 10.0

android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"

判断点击文件是否为apk,并且适配Android 5.0 到Android 10.0

导入包:import androidx.core.content.FileProvider;

else if(TypeFilter.getInstance().isApkFile(item_ext)){
   
   if(file.exists()) {
      if(mReturnIntent) {
         returnIntentResults(file);
         
      } else {
try {
   Intent installIntent = new Intent();
   installIntent.setAction(Intent.ACTION_VIEW);
   Uri apkUri = FileProvider.getUriForFile(getApplicationContext(), "com.softwinner.explore.fileprovider", file);///-----ide文件提供者名
   int version = android.os.Build.VERSION.SDK_INT;
   if (version > 24) {//android 7.0-10.0及以上版本
      installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
      installIntent.setDataAndType(apkUri, "application/vnd.android.package-archive");
   } else {//android 5.0-7.0
      installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      installIntent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");

   }
   startActivity(installIntent);
}catch (IllegalArgumentException e){

}
      }
   }
}

在AndroidManifest.xml文件中添加provider

<provider
    android:authorities="com.softwinner.explore.fileprovider"
    android:name="androidx.core.content.FileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <Meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>

在res目录下面创建一个xml文件,在该文件中创建filepaths文件

<?xml version="1.0" encoding="utf-8"?>

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path path="" name="cmrootfile" />
    <files-path path="" name="cmfiles" />
    <cache-path path="" name="cmcache" />
    <external-path path="" name="cmexternal" />
    <external-files-path path="" name="cmexternalfile" />
    <external-cache-path path="" name="cmexternalcache" />
</paths>

备注说明:
Android10 中使用FileProvider需要导入FileProvider包

import androidx.core.content.FileProvider;

在build.gradle文件中添加androidx的依赖

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

Android ApplicationInfo 应用程序信息的详解

Android ApplicationInfo 应用程序信息的详解

Android ApplicationInfo 应用程序信息

1、简述

1 ApplicationInfo是android.content.pm包下的一个实体类,用于封装应用的信息,flags是其中的一个成员变量public int flags = 0;用于保存应用的标志信息。

2 ApplicationInfo 通过它可以得到一个应用基本信息。
   这些信息是从AndroidManifest.xml的< application >标签获取的

3 ApplicationInfo对象里保存的信息都是<application>标签里的属性值

4 ApplicationInfo与ResolveInfo比较:前者能够得到Icon、Label、Meta-data、description。后者只能得到Icon、Label


2、获取ApplicationInfo

2.1 、获取手机上安装所有程序对应的 ApplicationInfo

/**
* 获取手机上安装的所有的程序对应的 ApplicationInfo
* 它是通过解析AndroidManifest.xml的< application>标签中得到的,所以它能得到所有的app
*
* 获取手机上的所有的安装的应用程序信息
* 参数为 标识  一般为 PackageManager.GET_UNINSTALLED_PACKAGES
*/
List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

2.2 、获取指定包名对应的 ApplicationInfo

 /**
* 获取指定应用程序 ApplicationInfo
* 参数一对应应用程序的包名
* 参数二 应用程序对应的标识 通常为 0
*/

      ApplicationInfo applicationInfo = packageManager.getApplicationInfo("com.androidlongs.contactsapplication",0);


3、通过ApplicationInfo来获取应用程序的 基本信息

3.1 、获取应用程序对应的包名、应用名称

//获取应用图标
Drawable drawable = applicationInfo.loadIcon(packageManager);

//获取应用程序的 包名
String appPackageName = applicationInfo.packageName;

//获取应用名
//参数 packageManager 是应用管理者对象 
String appName =applicationInfo.loadLabel(packageManager).toString();

3.2 、获取应用程序对应数据的目录以及占用的空间大小

//获取应用存放数据目录
String dir = applicationInfo.sourceDir;
Log.d("app ","应用存放数据目录 " +dir);

 //获取应用数据大小
ong length = new File(dir).length();

//转换为 M
float size = length*1f/1024/1024;
Log.d("app ","应用数据大小 " +length+"\t"+size);

3.3 、判断是否安装在外置储存空间存

//判断是否安装在外存
int flags = applicationInfo.flags;
if((flags&ApplicationInfo.FLAG_EXTERNAL_STORAGE)==ApplicationInfo.FLAG_EXTERNAL_STORAGE){
  Log.d("app "," 安装在 外置存储空间 ");
}else {
  Log.d("app "," 安装在 内置存储空间 ");
}

3.4 、判断应用程序是否是系统应用

//判断是否是系统应用
if((flags&ApplicationInfo.FLAG_SYstem)==ApplicationInfo.FLAG_SYstem){
  Log.d("app "," 是系统应用 ");
}else{
  Log.d("app "," 不是系统应用 ");
}

3.5 、manageSpaceActivityName

/**
 * 从”android:manageSpaceActivity“属性得到
 * 用于指定一个Activity来管理数据,
 * 它最终会出现在设置->应用程序管理中,
 * 默认为按钮为”清除数据”,指定此属性后,该按钮可点击跳转到该Activity,让用户选择性清除哪些数据。若不设置则为null.
 */
String activityName = applicationInfo.manageSpaceActivityName;
Log.i("applicationInfo","activityName: " + activityName);

3.6 、获取应用程序运行的进程

/**
 * 从”android:process“属性得到,注明应用运行的进程名。或不设置则默认为应用包名。
 */
String processName = applicationInfo.processName;
Log.i("applicationInfo","processName: " + processName);

3.7 、其他配置信息简述

// 配置文件中的android:backupAgent属性值,用于备份
      String backupAgentName = applicationInfo.backupAgentName;
      Log.i("applicationInfo","backupAgentName: " + backupAgentName);
      // 获取继承Application类的对象,维护全局的Application状态
      //但一般都不用继承的方式,可以通过Context.getApplicationContext()方法得到
      String className = applicationInfo.className;
      Log.i("applicationInfo","className: " + className);




      /**
       * 可选项,访问当前应用所有组件需要声明的权限,从”android:permission“属性得到。
       */
      String permisson = applicationInfo.permission;
      Log.i("applicationInfo","permisson: " + permisson);
      // 创建对象时,传入的是GET_SHARED_LIBRARY_FILES该属性才有值
      String[] files = applicationInfo.sharedLibraryFiles;
      Log.i("applicationInfo","files: " + files);
      // 存放数据的路径 应用数据目录。
      String dataPath = applicationInfo.dataDir;
      Log.i("applicationInfo","dataPath: " + dataPath);
      // 本地路径 JNI本地库存放路径。
      String nativePath = applicationInfo.nativeLibraryDir;
      Log.i("applicationInfo","nativePath:" + nativePath);
      // 公共资源路径
      String punlicSourcePath = applicationInfo.publicSourceDir;
      Log.i("applicationInfo","punlicSourcePath: " + punlicSourcePath);
      // 资源路径 应用APK的全路径
      String sourcePath = applicationInfo.sourceDir;
      Log.i("applicationInfo","sourcePath: " + sourcePath);

      /**
       * 当前应用所有Activity的默认task密切性。
       * 可以参考ActivityInfo的taskAffinity,从”android:taskAffinity“属性得到。
       * 具体taskAffinity是怎么影响到Activity在task的启动,后面会在Activity启动模式中细讲
       */
      String taskAffinity = applicationInfo.taskAffinity;
      Log.i("applicationInfo","taskAffinity: " + taskAffinity);
      // 如果是false,代表application里的所有组件都禁用
      boolean enable = applicationInfo.enabled;
      Log.i("applicationInfo","enable: " + enable);
      // 表述资源文件的标识
      int descriRes = applicationInfo.descriptionRes;
      Log.i("applicationInfo","descriRes: " + descriRes);
      int flag = applicationInfo.flags;
      Log.i("applicationInfo","flag: " + flag);
      // 指定smallest screen width的值,超过这个值,就要开启屏幕兼容
      int compatibleWidth = applicationInfo.compatibleWidthLimitDp;//android:compatibleWidthLimitDp属性
      Log.i("applicationInfo","compatibleWidth: " + compatibleWidth);
      // 同上,只是这时候用户无法禁止屏幕兼容模式,说明是强制启动屏幕兼容
      int largestWidth = applicationInfo.largestWidthLimitDp;//android:largestWidthLimitDp属性
      Log.i("applicationInfo","largestWidth: " + largestWidth);
      // 所需屏幕空间的最短尺寸,int samllestWidth = applicationInfo.requiresSmallestWidthDp;//android:requiresSmallestWidthDp属性
      Log.i("applicationInfo","samllestWidth: " + samllestWidth);
      // 应用所需的最小sdk版本
      int sdkVersion = applicationInfo.targetSdkVersion;
      Log.i("applicationInfo","sdkVersion: " + sdkVersion);
      int theme = applicationInfo.theme;
      Log.i("applicationInfo","theme: " + theme);//android:theme=
      int uid = applicationInfo.uid;
      Log.i("applicationInfo","uid: " + uid);
      // 配置文件中的uiOptions属性的值
      int uiOptions = applicationInfo.uiOptions;
      Log.i("applicationInfo","uiOptions: " + uiOptions);

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

android – 从包管理器中检索应用程序信息

android – 从包管理器中检索应用程序信息

有没有办法从PackageManager中提取ApplicationInfo对象?我已经尝试了许多不同类型的方法来实现这一点,但无济于事.我目前正在使用默认的 android启动器屏幕(应用程序抽屉),并希望从包名称中获取包信息.这不是在应用程序层,而是在Launcher2应用程序的构建层,源.我正在使用的android版本是2.3.3.

这是我尝试过的:

ApplicationInfo item = pack.getApplicationInfo(package_list.get(i),PackageManager.GET_ACTIVITIES);

错误:

Type mismatch: cannot convert from android.content.pm.ApplicationInfo to com.android.launcher2.ApplicationInfo

这不是用于检索当前正在运行的程序包,而是用于检索手机本身上的所有应用程序.

我找到:

pack.getApplicationInfo(packageName,flags)

不会返回与传递给AllApps2D.java中的以下函数的ApplicationInfo相同的ApplicationInfo对象:

public void addApps(ArrayList<ApplicationInfo> list)

我试图从包本身拉出ApplicationInfo对象只有名称.

有问题的函数如下所示,如AllApps2D.java(Launcher2文件夹)的开源代码中所示.

private ArrayList<ApplicationInfo> mAllAppsList = new ArrayList<ApplicationInfo>();

 public void addApps(ArrayList<ApplicationInfo> list) {
        final int N = list.size();

        for (int i=0; i<N; i++) {
            final ApplicationInfo item = list.get(i);
            int index = Collections.binarySearch(mAllAppsList,item,LauncherModel.APP_NAME_COMParaTOR);
            if (index < 0) {
                index = -(index+1);
            }
            mAllAppsList.add(index,item);
        }
        mAppsAdapter.notifyDataSetChanged();
    }

UPDATE

基本上我要做的是用自定义顺序重新排列启动器中图标的排列.如果我可以通过PackageManager检索所需的信息,那将是理想的选择.

为了实现我的工作,我必须能够实现相同的目标
AllApps2D代码正在使用的ApplicationInfo对象,显然:

com.android.Launcher2.ApplicationInfo

这与返回的内容不同:

ApplicationInfo item = pack.getApplicationInfo(package_list.get(i),PackageManager.GET_ACTIVITIES);

这是:

android.content.pm.ApplicationInfo

可用于启动器的代码和我正在使用的类是here.

这些技术都没有在android构建中的launcher2应用程序中工作.还有其他建议吗?

解决方法

如果要获取所有应用程序,请执行以下操作:

import android.content.pm.ApplicationInfo;

...

List<ApplicationInfo> apps = context.getPackageManager().getInstalledApplications(0);

有关单个应用程序的信息(假设您知道其清单包名称),请执行以下操作:

import android.content.pm.ApplicationInfo;

...

ApplicationInfo app = context.getPackageManager().getApplicationInfo(packageName,0);

今天的关于更改android中的包管理器应用程序信息元数据apk包管理器的分享已经结束,谢谢您的关注,如果想了解更多关于Android 11 Scoped Storage 权限(如何管理文件管理器应用程序,文件管理器应用程序怎么样)、Android 5.0 6.0 7.0 8.0 9.0 10.0 适配文件管理器应用安装、Android ApplicationInfo 应用程序信息的详解、android – 从包管理器中检索应用程序信息的相关知识,请在本站进行查询。

本文标签: