在Android 4.4(KitKat)上,谷歌已经限制了对SD卡的访问.
从Android Lollipop(5.0)开始,开发人员可以使用新的API,要求用户确认允许访问特定文件夹,如此Google-Groups帖子所述.
该帖子指导您访问两个网站:
这看起来像是一个内部示例(可能稍后会在API演示中显示),但很难理解发生了什么.
这是新API的官方文档,但它没有详细说明如何使用它.
这是它告诉你的:
如果您确实需要完全访问整个文档子树,请首先启动ACTION_OPEN_DOCUMENT_TREE以允许用户选择目录.然后将生成的getData()传递给fromTreeUri(Context,Uri)以开始使用用户选择的树.
在导航DocumentFile实例树时,您始终可以使用getUri()来获取表示该对象的基础文档的Uri,以便与openInputStream(Uri)等一起使用.
要在运行KITKAT或更早版本的设备上简化代码,可以使用fromFile(File)来模拟DocumentsProvider的行为.
我对新API有几个问题:
我的应用程序(在此处)可以在整个文件系统(不仅是已安装的应用程序)中搜索APK文件,显示有关每个文件的信息,允许删除,共享,安装...
作为Android Q范围内存储功能的一部分,Google宣布SAF(存储访问框架)将取代常规存储权限。这意味着,即使您尝试使用存储权限,也只会授予访问特定类型的文件的权限,以使File和file-path可以使用或完全沙箱化(在此处撰写)。
这意味着许多框架将需要依赖SAF而不是File和file-path。
其中之一是packageManager.getPackageArchiveInfo,它给出了文件路径,返回 PackageInfo,我可以得到有关以下内容的各种信息:
packageInfo.applicationInfo.loadLabel(packageManager)。这基于设备的当前配置(语言环境等)。packageInfo.packageNamepackageInfo.versionCode或packageInfo.longVersionCode。packageInfo.versionName一种。 BitmapFactory.decodeResource(packageManager.getResourcesForApplication(applicationInfo),packageInfo.applicationInfo.icon, bitmapOptions)
b。如果已安装,AppCompatResources.getDrawable(createPackageContext(packageInfo.packageName, 0), packageInfo.applicationInfo.icon )
C。 ResourcesCompat.getDrawable(packageManager.getResourcesForApplication(applicationInfo), packageInfo.applicationInfo.icon, null)
它还有很多其他功能,它们可以返回您,还有很多可选功能,但我认为这些是有关APK文件的基本详细信息。
我希望Google可以为此提供一个很好的替代方法(在此和此处要求),因为目前我找不到任何好的解决方案。
使用从SAF获得的Uri并从中获得InputStream很容易:
@TargetApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
packageInstaller = packageManager.packageInstaller
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "application/vnd.android.package-archive"
startActivityForResult(intent, 1)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { …Run Code Online (Sandbox Code Playgroud) android inputstream apk android-package-managers scoped-storage
我想在我的应用中以编程方式创建符号链接。在Android(4.4+)中可以吗?
在Java中,我们可以使用:
Path newLink = ...;
Path target = ...;
try {
Files.createSymbolicLink(newLink, target);
} catch (IOException x) {
System.err.println(x);
} catch (UnsupportedOperationException x) {
// Some file systems do not support symbolic links.
System.err.println(x);
}
Run Code Online (Sandbox Code Playgroud)
从java.nio.file但我应该在Android中使用?
https://docs.oracle.com/javase/tutorial/essential/io/links.html
编辑:
我测试使用reflection/native code/OS.symlink() method,没有任何工作。我总是收到不允许的操作(EPERM)。我认为您必须具有root权限才能创建符号链接。
问题可能/mnt/sdcard在于包装的FUSE垫片/data/media/xxx。所以我开始使用,/data/media/xxx但我总是得到Permission denied
我认为root权限存在问题。
android ×3
android-ndk ×1
apk ×1
documentfile ×1
filesystems ×1
inputstream ×1
java ×1
symlink ×1