相关疑难解决方法(0)

如何在不使用文件或文件路径的情况下获取文件系统(不仅仅是已安装的文件)中APK文件的信息?

背景

我的应用程序(在此处)可以在整个文件系统(不仅是已安装的应用程序)中搜索APK文件,显示有关每个文件的信息,允许删除,共享,安装...

作为Android Q范围内存储功能的一部分,Google宣布SAF(存储访问框架)将取代常规存储权限。这意味着,即使您尝试使用存储权限,也只会授予访问特定类型的文件的权限,以使File和file-path可以使用或完全沙箱化(在此处撰写)。

这意味着许多框架将需要依赖SAF而不是File和file-path。

问题

其中之一是packageManager.getPackageArchiveInfo,它给出了文件路径,返回 PackageInfo,我可以得到有关以下内容的各种信息:

  1. 名称(在当前配置上),使用,也称为“标签” packageInfo.applicationInfo.loadLabel(packageManager)。这基于设备的当前配置(语言环境等)。
  2. 包名称,使用 packageInfo.packageName
  3. 版本代码,使用packageInfo.versionCodepackageInfo.longVersionCode
  4. 版本号,使用 packageInfo.versionName
  5. 应用图标,根据当前配置(密度等...)以各种方式使用:

一种。 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

51
推荐指数
2
解决办法
1519
查看次数

我怎样才能修剪Uri的视频,包括`mp4parser`库可以处理的文件,而是使用Android的框架呢?

背景

在过去的几年里,我一直在做的视频修剪库的定制,更多更新的版本的工作,在这里(基于这个库)

问题

虽然在大多数情况下,我已经成功地将其定制,甚至将所有文件转换为Kotlin,但它在修剪本身时遇到了一个重大问题.

它假定输入始终是文件,因此如果用户从返回Uri的应用选择器中选择一个项目,它就会崩溃.这样做的原因不仅仅是UI本身,还因为它用于修剪的库(mp4parser)假定只输入File(或文件路径)而不是Uri(在此处写过).我尝试了多种方法来让它获得一个Uri,但失败了.还在这里写了一下.

这就是为什么我使用我在StackOverflow(这里)找到的解决方案进行修剪的原因.关于它的好处是它很安静,只使用Android的框架本身.但是,似乎对于某些视频文件,它总是无法修剪它们.由于这些文件的一个例子,有一个原始库的储存库,在这里(问题报道这里).

看看异常,这就是我得到的:

E: Unsupported mime 'audio/ac3'
E: FATAL EXCEPTION: pool-1-thread-1
    Process: life.knowledge4.videocroppersample, PID: 26274
    java.lang.IllegalStateException: Failed to add the track to the muxer
        at android.media.MediaMuxer.nativeAddTrack(Native Method)
        at android.media.MediaMuxer.addTrack(MediaMuxer.java:626)
        at life.knowledge4.videotrimmer.utils.TrimVideoUtils.genVideoUsingMuxer(TrimVideoUtils.kt:77)
        at life.knowledge4.videotrimmer.utils.TrimVideoUtils.genVideoUsingMp4Parser(TrimVideoUtils.kt:144)
        at life.knowledge4.videotrimmer.utils.TrimVideoUtils.startTrim(TrimVideoUtils.kt:47)
        at life.knowledge4.videotrimmer.BaseVideoTrimmerView$initiateTrimming$1.execute(BaseVideoTrimmerView.kt:220)
        at life.knowledge4.videotrimmer.utils.BackgroundExecutor$Task.run(BackgroundExecutor.java:210)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:764)
Run Code Online (Sandbox Code Playgroud)

我发现了什么

  1. 这里报道了这个问题.我不认为它会得到答案,因为图书馆多年来没有更新......
  2. 看着异常,我试着在没有声音的情况下修剪.这有效,但这不是一件好事,因为我们想要正常修剪.
  3. 认为这段代码可能基于别人的代码,我试图找到原始代码.我发现它基于其图库应用程序中的一些旧的Google代码,在此处 …

android video-editing mediamuxer

15
推荐指数
1
解决办法
450
查看次数

如何使用ACTION_OPEN_DOCUMENT显示更多提供者

我想使用作为Storage Access Framework一部分提供的android系统对话框来打开文件.我这样做

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("application/pdf");
startActivityForResult(intent, EDIT_REQUEST);
Run Code Online (Sandbox Code Playgroud)

然后处理返回的URI onActivityResult().

问题是,在结果菜单中,我得到的内容提供商远远少于我的预期.仅限Google云端硬盘和下载(请参阅下面的左侧屏幕截图).其他人,如Dropbox,Solid Explorer,......都没有显示.

我怀疑原因是这些应用程序根本没有设置必要的intent过滤器显示在此列表中.

但是,其他应用程序(例如Kaiten Mail或Chrome)以某种方式设法显示系统对话框,其中包含完全实现的内容提供程序,位于列表顶部,然后其他应用程序(如Dropbox和Solid Explorer)在下方用细条分隔(请参阅正确的屏幕截图).

我怎么能得到这种行为?

比较我得到的行为(左)和我想要的行为(右)

android android-contentprovider

11
推荐指数
1
解决办法
1201
查看次数

修剪视频像whatsapp

我在whatsapp messenger中看到了独特的功能.在发送视频应用程序之前,允许用户选择帧,用户只能将那些选定的帧作为视频发送.

那么,我的问题是我们如何在帧中划分视频并再次从分割帧中分割视频?whatsapp messagnes是如何做的?

video java-native-interface android video-editing

7
推荐指数
2
解决办法
1万
查看次数

如何使用MediaCodec修剪视频

我正在尝试使用MediaProjection API记录屏幕。我想修剪媒体投影录制的视频。有没有不使用任何第三方依赖项的方法?

android mediamuxer android-mediaprojection android-mediacodec

1
推荐指数
1
解决办法
2255
查看次数