kotlin Android API 28,将文件保存在下载文件夹中,无需用户交互

332nm8kg  于 2022-11-16  发布在  Kotlin
关注(0)|答案(2)|浏览(188)

我们正在开发一个应用程序,将作为一个服务运行。其中一个功能将下载文件在给定的URL(ex PDF),并保存到下载文件夹,以便用户可以从一个特定的应用程序(AvenzaMap)加载它。
所有的下载过程都应该没有任何用户交互,因为它是由一个在后台运行的服务完成的。
我添加了以下权限:

安卓清单.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

<application
    android:requestLegacyExternalStorage="true"

无论我将尝试我得到以下错误

java.io.FileNotFoundException: /storage/emulated/0/Download/name.pdf (Permission denied)

如何获得对下载文件夹(这是系统下载文件夹)的写入权限,而无需打开Activity来保存文件?
我会尝试多个解决方案尚未(2天的谷歌)没有成功
如前所述,目前我们以API 28(android 9)为目标,稍后我们将以其他API为目标,因为我们将设备提供给客户端,所以我们仅针对设备所具有的API进行开发。

shyt4zoc

shyt4zoc1#

我最近不得不开发一个将语音文件下载到设备的应用程序。虽然你可以在Android清单中指定权限,但你必须向用户请求权限。我已经用Java完成了这一操作,但转换到Kotlin应该很简单。

//method is called to check the storage permissions for this app
//ensures the app can write and read files
private void checkStoragePermissions() {
    Log.i("Permissions", "Checking Storage Permissions");

    int writePermissionCode = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);//get current write permission
    int readPermissionCode = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);//ge current read permission
    Log.i("Permissions", "Fetching Read & Write Codes: " + readPermissionCode + "/" + writePermissionCode);

    //if permissions to read and write to external storage is not granted
    if (writePermissionCode != PackageManager.PERMISSION_GRANTED || readPermissionCode != PackageManager.PERMISSION_GRANTED) {
        //request read and write permissions
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PackageManager.PERMISSION_GRANTED);
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PackageManager.PERMISSION_GRANTED);
        Log.i("Permissions", "Asking For Storage Permissions");

    } else {//else: if permissions to read and write is already granted
        permissionsGranted = true;//set permissions granted bool to true
    }
}

完成此操作后,可以通过多种方式下载文件。值得注意的是,文件不能下载到Android设备上的任何位置。只能使用特定的目标位置。
我希望这能帮助你消除一些困惑。编码快乐!

ctrmrzij

ctrmrzij2#

如何获得对下载文件夹(这是系统下载文件夹)的写入权限,而无需打开Activity来保存文件?
最简单的解决方案是在不需要权限的地方编写代码。Context上返回File对象的方法,如getFilesDir()getExternalFilesDir(),是主要的候选方法。
除此之外,您的应用程序似乎已预装在某些设备上(“我们向客户端提供设备”)。如果您已开发自定义固件映像,则应能够将权限作为该映像的一部分预先授予您的应用。或者,如果设备已配置并正在分发(没有首次开机的Onboarding UI),您可以手动将WRITE_EXTERNAL_STORAGE授予您的应用,或让UI自动化脚本执行此操作。
如果这些都不是选项,则您别无选择,只能向用户请求权限。

相关问题