无法访问“下载”文件夹

如何解决无法访问“下载”文件夹

我正在尝试将 txt 文件保存到我的第一个 abndroid 应用程序的下载文件夹中。


public class DisplaySettingsActivity extends AppCompatActivity implements View.OnClickListener {

    private H300sVoipSettings settings;

    Button saveIntoFile;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_settings);

        this.settings = (H300sVoipSettings) getIntent().getSerializableExtra("H300sVoipSettings");

        this.saveIntoFile = (Button)findViewById(R.id.save);
        this.saveIntoFile.setOnClickListener(this);
    }

private String saveFile(){
        Log.d("Η300s","Saving");
        String state = Environment.getExternalStorageState();
        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            Log.e("H300s","Unable to detect external storage");
            return null;
        }

        DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyMMdd");
        File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

        file = new File( file.getAbsolutePath(),"voip_h300s_"+pattern.format(LocalDate.now())+".txt");
        Log.d("H300s",file.toString());
        try {
            Log.d("H300s","Saving");
            this.settings.save(file);
            Log.d("H300s","Saved");
            Log.d("H300s",file.getAbsolutePath());
            return file.getAbsolutePath();
        } catch (Exception e) {
            Log.e("H300s",e.toString());
            Log.e("H300s",Log.getStackTraceString(e));
            return null;
        }
    }
}

但是我函数中的这段代码:

 this.settings.save(file);

由于缺乏权限而无法保存。如以下日志所示:

2021-04-24 14:48:18.498 8208-8208/com.example.vodafone_fu_h300s E/H300s: java.io.IOException: Permission denied
2021-04-24 14:48:18.499 8208-8208/com.example.vodafone_fu_h300s E/H300s: java.io.IOException: Permission denied
        at java.io.UnixFileSystem.createFileExclusively0(Native Method)
        at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:281)
        at java.io.File.createNewFile(File.java:1008)
        at pc_magas.vodafone_fu_h300s.screens.DisplaySettingsActivity.saveFile(DisplaySettingsActivity.java:97)
        at pc_magas.vodafone_fu_h300s.screens.DisplaySettingsActivity.onClick(DisplaySettingsActivity.java:120)
        at android.view.View.performClick(View.java:6597)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25906)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我想要做的是将一个 txt 文件保存到下载文件夹中,并让用户通过文件管理器访问它。类 H300sVoipSettings 具有以下内容:

public class H300sVoipSettings implements Serializable
{
    private String username = null;

    private String password = null;

    private String primary_registar =  null;

    private String primary_registar_port = null;

    private String secondary_registar = null;

    private String secondary_registar_port = null;

    private String primary_proxy = null;

    private String primary_proxy_port = null;

    private String secondary_proxy = null;

    private String secondary_proxy_port = null;

    private String sip_domain = null;

    private String sip_number = null;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPrimary_registar() {
        return primary_registar;
    }

    public void setPrimary_registar(String primary_registar) {
        this.primary_registar = primary_registar;
    }

    public String getPrimary_registar_port() {
        return primary_registar_port;
    }

    public void setPrimary_registar_port(String primary_registar_port) {
        this.primary_registar_port = primary_registar_port;
    }

    public String getSecondary_registar() {
        if(secondary_registar == null || secondary_registar.trim().equals("")){
            return null;
        }
        return secondary_registar;
    }

    public void setSecondary_registar(String secondary_registar) {
        this.secondary_registar = secondary_registar;
    }

    public String getSecondary_registar_port() {
        return secondary_registar_port;
    }

    public void setSecondary_registar_port(String secondary_registar_port) {
        this.secondary_registar_port = secondary_registar_port;
    }

    public String getPrimary_proxy() {
        return primary_proxy;
    }

    public void setPrimary_proxy(String primary_proxy) {
        this.primary_proxy = primary_proxy;
    }

    public String getPrimary_proxy_port() {
        return primary_proxy_port;
    }

    public void setPrimary_proxy_port(String primary_proxy_port) {
        this.primary_proxy_port = primary_proxy_port;
    }

    public String getSecondary_proxy() {
        return secondary_proxy;
    }

    public void setSecondary_proxy(String secondary_proxy) {
        this.secondary_proxy = secondary_proxy;
    }

    public String getSecondary_proxy_port() {
        return secondary_proxy_port;
    }

    public void setSecondary_proxy_port(String secondary_proxy_port) {
        this.secondary_proxy_port = secondary_proxy_port;
    }

    public String getSip_domain() {
        return sip_domain;
    }

    public void setSip_domain(String sip_domain) {
        this.sip_domain = sip_domain;
    }

    public String getSip_number() {
        return sip_number;
    }

    public void setSip_number(String sip_number) {
        this.sip_number = sip_number;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public static H300sVoipSettings createFromJson(String jsonString) throws IllegalArgumentException,JSONException {
        if(jsonString == null || jsonString.trim().equals("")){
            throw new IllegalArgumentException("JsonString Should not be empty");
        }

        JSONArray settingsJson = new JSONArray(jsonString);
        H300sVoipSettings settings = new H300sVoipSettings();

        for (int i = 0; i < settingsJson.length(); i++) {
            JSONObject item = settingsJson.getJSONObject(i);
            if(item.getString("type").equals("provider")){
                settings.setPrimary_registar(item.getString("primary_registrar"));
                settings.setPrimary_registar_port(item.getString("primary_registrar_port"));
                settings.setPrimary_proxy(item.getString("primary_proxy"));
                settings.setPrimary_proxy_port(item.getString("primary_proxy_port"));
                settings.setSip_domain(item.getString("sip_domain"));
                String secondary_proxy = item.getString("secondary_proxy");
                if(secondary_proxy != null && !secondary_proxy.trim().equals("")){
                    settings.setSecondary_proxy(secondary_proxy.trim());
                }
                settings.setSecondary_proxy_port(item.getString("secondary_proxy_port"));
                settings.setSecondary_registar(item.getString("secondary_registrar"));
                settings.setSecondary_registar_port(item.getString("secondary_registrar_port"));
            } else if(item.getString("type").equals("number")){
                settings.setSip_number(item.getString("sip_number"));
                settings.setUsername(item.getString("username"));
                settings.setPassword(item.getString("password"));
            }
        }

        return settings;
    }

    public boolean equals(H300sVoipSettings other){

        boolean truth =  other.getPassword().equals(this.getPassword()) &&
               other.getUsername().equals(this.getUsername()) &&
               other.getSip_number().equals(this.getSip_number()) &&
               other.getSip_domain().equals(this.getSip_domain()) &&
               other.getPrimary_proxy().equals(this.getPrimary_proxy()) &&
               other.getPrimary_proxy_port().equals(this.getPrimary_proxy_port()) &&
               other.getPrimary_registar().equals(this.getPrimary_registar()) &&
               other.getPrimary_registar_port().equals(this.getPrimary_registar_port()) &&
               other.getSecondary_proxy_port().equals(this.getSecondary_proxy_port()) &&
               other.getSecondary_registar_port().equals(this.getSecondary_registar_port());


        truth = truth && ((other.getSecondary_proxy() == null && this.getSecondary_proxy() == null) || (other.getSecondary_proxy().equals(this.getSecondary_proxy())));
        truth = truth &&
                (
                        (other.getSecondary_registar() == null && this.getSecondary_registar() == null) ||
                                (
                                        other.getSecondary_registar().equals(this.getSecondary_registar())
                                )
                );
        return truth;
    }

    public String toString()
    {
        StringBuilder txt = new StringBuilder();

            txt.append("Phone Number: ");
            txt.append(this.getSip_number());
            txt.append("\n");

            txt.append("Username: ");
            txt.append(this.getUsername());
            txt.append("\n");

            txt.append("Password: ");
            txt.append(this.getPassword());
            txt.append("\n");

            txt.append("Sip Domain: ");
            txt.append(this.getSip_domain());
            txt.append("\n");

            txt.append("Primary proxy: ");
            txt.append(this.getPrimary_proxy());
            txt.append(" Port: ");
            txt.append(this.getPrimary_proxy_port());
            txt.append("\n");

            txt.append("Secondary proxy: ");
            String secondary_proxy = this.getSecondary_proxy();
            secondary_proxy = (secondary_proxy == null || !secondary_proxy.trim().equals(""))?"N/A":secondary_proxy;
            txt.append(secondary_proxy);
            txt.append(" Port: ");
            String secondaryProxyPort = this.getSecondary_proxy_port();
            secondaryProxyPort=(secondaryProxyPort == null || !secondaryProxyPort.trim().equals(""))?"N/A":secondaryProxyPort;
            txt.append(secondaryProxyPort);
            txt.append("\n");

            txt.append("Primary Registar: ");
            String primaryRegistar = this.getPrimary_registar();
            txt.append(primaryRegistar);
            txt.append(" Port: ");
            String primaryRegistarPort = this.getPrimary_registar_port();
            txt.append(primaryRegistarPort);
            txt.append("\n");

            txt.append("Secondary Registar: ");
            String secondary_registar = this.getSecondary_registar();
            secondary_registar = (secondary_registar == null || !secondary_registar.trim().equals(""))?"N/A":secondary_registar;
            txt.append(secondary_registar);
            txt.append(" Port: ");
            String secondaryRegistarPort = this.getSecondary_registar();
            secondaryRegistarPort=(secondaryRegistarPort == null || !secondaryRegistarPort.trim().equals(""))?"N/A":secondaryRegistarPort;
            txt.append(secondaryRegistarPort);
            txt.append("\n");

        return txt.toString();
    }

    public void save(File file) throws IOException {
        PrintWriter out = new PrintWriter(new FileWriter(file));
        out.println("********");
        out.print("Exported Date: ");
        out.println(new Date().toString());
        out.println("********");
        out.print(this.toString());
        out.close();
    }
}

并且用于数据序列化。该应用程序在 Android Manifest 中有以下内容:

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

此外,我查看了这些答案,但没有任何结果:

那么你知道我如何访问 donwloads 文件夹吗?

解决方法

尽管有权限:

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

您还应该提示用户接受这些请求。为了实现这一点,onCLick 函数应该是:

public void onClick(View v) {
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            Log.d("H300s","Permission Accepted");
            saveFile();
        } else {
            requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE );
        }
    }

requestPermissionLauncher 初始化为 onCreate 的地方如下:

        requestPermissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(),isGranted -> {
            Log.d("H300s","Permissions Callback");

            if (isGranted) {
                Log.d("H300s","Permission Accepted 2");
                saveFile();
            } else {
                permissionSaveDenied();
            }
        });

此外,请确保在 build.gradle 处放置以下内容:

    implementation 'androidx.activity:activity-ktx:1.2.0'
    implementation 'androidx.fragment:fragment:1.3.0'

为了让 ActivityResultContracts 正常工作。

额外提示

您可以跳过声明需要此权限:

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

因为应用程序会要求用户提供它。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res