Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 给定VectorDrawable的字节数组,如何从中创建VectorDrawable的实例? 背景_Android_Apk_Androidx_Android Vectordrawable - Fatal编程技术网

Android 给定VectorDrawable的字节数组,如何从中创建VectorDrawable的实例? 背景

Android 给定VectorDrawable的字节数组,如何从中创建VectorDrawable的实例? 背景,android,apk,androidx,android-vectordrawable,Android,Apk,Androidx,Android Vectordrawable,在设备的存储器中查找APK文件,显示有关这些文件的信息并允许对其执行操作 问题 事情是,自从Google增加了关于存储的新限制之后,我一直在试图找到解决方案,解决如何在没有存储许可的情况下解析APK文件的问题(因为框架只能处理文件路径)。目前,我使用(requestLegacyExternalStorage)来处理文件路径,但在下一版本Android之前,这是一个临时解决方案 我的努力和发现 目前,使用a和a(链接),我成功地获得了基本信息和应用程序名称,但对于图标,它变得混乱:错误的限定符,可

在设备的存储器中查找APK文件,显示有关这些文件的信息并允许对其执行操作

问题 事情是,自从Google增加了关于存储的新限制之后,我一直在试图找到解决方案,解决如何在没有存储许可的情况下解析APK文件的问题(因为框架只能处理文件路径)。目前,我使用(requestLegacyExternalStorage)来处理文件路径,但在下一版本Android之前,这是一个临时解决方案

我的努力和发现 目前,使用a和a(链接),我成功地获得了基本信息和应用程序名称,但对于图标,它变得混乱:错误的限定符,可以返回PNG而不是VectorDrawable,VectorDrawable只是一个字节数组

但是,即使我忽略了它的问题,我也试图查看各种可矢量绘制的函数,以及它的android-x函数(实际上是),试图用我得到的创建一个实例。由于某种原因,我尝试的每个函数都没有帮助

问题 是否可以从字节码动态加载VectorDrawable?现在我计划使用它自己解析APK(因为遗憾的是Google计划增加访问文件的限制,使用糟糕的SAF),但遗憾的是对于VectorDrawable,它只有一个字节数组

只是想澄清一下:我说的是从SAF访问APK文件(不是安装的文件,因为获取这些信息仍然可以正常工作)。有了存储权限,它工作得很好(当然还有已安装的应用程序)。看见当您尝试在普通框架中使用SAF时,您将得到错误的结果:一个字符串,其中包名作为应用程序名,默认图标作为应用程序图标(或者更糟:一个异常)。
另外请注意:我知道我可以将文件复制到我自己的应用程序存储中,并仅使用框架,但这不是一个好的解决方案,因为如果我想显示设备上所有APK文件的信息,仅获取图标和应用程序名将浪费空间和时间。。。我需要一个更直接的方法。应用程序处理速度最快的一种。如果您拥有的vector drawable的字节数组具有二进制XML格式,那么您应该能够通过将数组传递给我从我的数据库中获取的以下方法来创建它:

/**
*从二进制XML字节数组创建可绘制的向量。
*@param context任何上下文。
*@param binXml包含二进制XML的字节数组。
*@return矢量可绘制或为空,无法创建。
*/
公共静态可绘制getVectorDrawable(@NonNull上下文,@NonNull字节[]binXml){
试一试{
//获取二进制XML解析器(XmlBlock.parser)并使用它创建可绘制的
//这相当于AssetManager#getXml()的功能
@SuppressLint(“PrivateApi”)
Class xmlBlock=Class.forName(“android.content.res.xmlBlock”);
构造函数xmlBlockConstr=xmlBlock.getConstructor(字节[].class);
方法xmlParserNew=xmlBlock.getDeclaredMethod(“newParser”);
xmlBlockConstr.setAccessible(true);
xmlParserNew.setAccessible(true);
XmlPullParser parser=(XmlPullParser)xmlParserNew.invoke(
newInstance((对象)binXml));
如果(Build.VERSION.SDK_INT>=24){
返回Drawable.createFromXml(context.getResources(),解析器);
}否则{
//在API 24之前,如果没有compat lib,矢量绘图无法正确呈现
final AttributeSet attrs=Xml.asAttributeSet(解析器);
int type=parser.next();
while(type!=XmlPullParser.START_标记){
type=parser.next();
}
返回VectorDrawableCompat.createFromXmlInner(context.getResources(),解析器,attrs,null);
}
}捕获(例外e){
Log.e(标记“向量创建失败”,e);
}
返回null;
}
我没有对它进行测试,但是如果您的字节数组真的是向量可绘制的二进制XML,我看不出它为什么不起作用,这正是
XmlPullParser
vectordawable
希望解析的

EDIT:我尝试使用XmlPullParser创建如下可绘制图形:

val xml = """
|<vector xmlns:android="http://schemas.android.com/apk/res/android"
|    android:width="24dp"
|    android:height="24dp"
|    android:viewportWidth="24.0"
|    android:viewportHeight="24.0">
|    <path
|        android:pathData="M9.5,3A6.5,6.5 0,0 0,3 9.5A6.5,6.5 0,0 0,9.5 16A6.5,6.5 0,0 0,13.33 14.744L18.586,20L20,18.586L14.742,13.328A6.5,6.5 0,0 0,16 9.5A6.5,6.5 0,0 0,9.5 3zM9.5,5A4.5,4.5 0,0 1,14 9.5A4.5,4.5 0,0 1,9.5 14A4.5,4.5 0,0 1,5 9.5A4.5,4.5 0,0 1,9.5 5z"
|        android:fillColor="#000000"/>
|</vector>
""".trimMargin()

val parser = XmlPullParserFactory.newInstance().newPullParser()
parser.setInput(xml.reader())

val drawable = Drawable.createFromXml(resources, parser, theme)
iconView.setImageDrawable(drawable)
val xml=”“”
|
|    
|
“.trimMargin()
val parser=XmlPullParserFactory.newInstance().newPullParser()
parser.setInput(xml.reader())
val drawable=drawable.createFromXml(参考资料、解析器、主题)
iconView.setImageDrawable(可绘制)

但是,这失败了,出现了一个异常:java.lang.ClassCastException:android.util.XmlPullAttributes不能强制转换为android.content.res.XmlBlock$Parser。所以这毕竟不可能回答您的评论。

您知道字节数组的格式吗?它是二进制XML吗?如果幸运的话,您只需要解析它并将其提供给VectorDrawableCompat,就像我在
getVectorDrawable
方法中所做的那样。有人做了一个解析器,我想你可以做JNI绑定并使用它。@Nicolas很确定它是二进制的。你能分享一下这样做的过程吗?从二进制字节数组进行解析,并从中获取矢量图?如果你使用已经存在的东西,为什么要写解析器呢?事实上我不知道为什么我要谈论解析器,你根本不需要它。事实上,我的另一个答案创建了二进制XML,以便在其中包含路径数据。但是,如果您已经有了二进制XML,那么您只需要使用它创建可绘制文件。因为没有构造器,这就是我的答案中的方法通过使用反射所做的。看起来很有希望!迫不及待地想尝试一下!但是,为什么要反思?难道没有更好的解决办法吗?我已经看到支持库VectorDraw的多个函数可以创建一个。它们都不管用吗?我希望我只是没有正确地使用它们…哇,我已经测试过了,它成功了!干得好!你是如何找到这个解决方案的?有没有一个没有反光的