文件输入流在 Api 级别 29 上不起作用

Posted

技术标签:

【中文标题】文件输入流在 Api 级别 29 上不起作用【英文标题】:File Input Stream not working on Api level 29 【发布时间】:2020-02-03 00:33:29 【问题描述】:

我有一个尝试提取 m3u 文件的方法,但它在 api 级别 29 上不起作用。我在 Logcat 屏幕上收到以下错误:

2019-10-03 20:46:53.165 32591-417/? E/Google: java.io.IOException: Cleartext HTTP traffic to mysite.tk not permitted

我的方法:

@SuppressLint("StaticFieldLeak")
class _loadFile extends AsyncTask<String, Void, Boolean> 

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        spinner.setVisibility(View.VISIBLE);
    

    @Override
    protected Boolean doInBackground(String... strings) 
        try  //new FileInputStream (new File(name)
            is = new FileInputStream(new File(strings[0])); // if u r trying to open file from asstes InputStream is = getassets.open(); InputStream
            M3UPlaylist playlist = parser.parseFile(is);
            mAdapter.update(playlist.getPlaylistItems());

            return true;
         catch (Exception e) 
            Log.d("Google", "_loadFile: " + e.toString());
            return false;
        
    

    @Override
    protected void onPostExecute(Boolean aBoolean) 
        super.onPostExecute(aBoolean);
        spinner.setVisibility(View.GONE);
    

编辑:

我给了 ClearText 权限,但是出现了一个新的错误。

Google: _loadFile: java.io.FileNotFoundException: /storage/emulated/0/Netuptv/data.m3u: open failed: ENOENT (No such file or directory)

编辑:

我的文件路径。我认为问题就在这里。但是我没有解决它的信息。

   static final File DEFA = Environment.getExternalStorageDirectory();
    public static final File dir = new File(DEFA.getPath() + "/Netuptv");
    static final File filepath = new File(dir.getPath() + "/data.m3u");

【问题讨论】:

【参考方案1】:

android 11 上进行测试的快速但非永久性修复:

添加android:requestLegacyExternalStorage="true"

变化

compileSdkVersion 29 targetSdkVersion 29

build.gradle 中的两者都为 29

【讨论】:

【参考方案2】:

请检查您是否将此行 android:usesCleartextTraffic="true" 添加到您的清单中。

由于文件访问 API 在 Android Q 上已被弃用,我强烈建议您阅读 CommaneWare 的 article,正如本文所述,尽量使用 android:requestLegacyExternalStorage="true" 以避免文件访问问题

尝试以下方法:

        String fileName = "data.m3u";
        File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
                        + "/Netuptv");
        boolean success = true;
        if (!storageDir.exists()) 
            success = storageDir.mkdirs();
        
        if (success) 
            File file = new File(storageDir,fileName);
            filepath = file.getAbsolutePath();
        

【讨论】:

属性 android:requestLegacyExternalStorage 未找到。 @jonyiash 您需要将targetSdkVersioncompileSdkVersion 设置为29 是的,我明白了。然后添加 "android: requestLegacyExternalStorage =" true " ,但同样的错误 /storage/emulated/0/Netuptv/data.m3u: open failed: ENOENT (No such file or directory) 我该怎么办?你有什么想法吗? @jonyiash ,我已经更新了我的答案,尝试使用getExternalStoragePublicDirectory【参考方案3】:

Android 10(API 级别 29)文件访问已被弃用,它被称为 scoped storage

【讨论】:

我该怎么办? 看这里:***.com/a/57371742/2944616 记得采纳正确的回复,栈溢出不是一个简单的论坛。谢谢。 我是新手,我不知道该怎么办。可以分享代码吗? 这就是为什么我说如果它适合你就接受响应的原因,这就是 *** 的工作原理 我还没开始呢。如果可以的话,我会接受正确的答案。但在它是真的之前我需要确定。

以上是关于文件输入流在 Api 级别 29 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

WebView.loadData 在 Android 9.0 (API-29) 上不起作用

为啥外部链接在构建后在 phonegap 应用程序上不起作用

为啥 pull-right 类在 bootstrap 版本 4.1.0 上不起作用? [复制]

Web Audio API 演示在 iOS 上不起作用

WebSockets 在 Tomcat 7 上不起作用

位置的 getSpeed() 在 WiFi 上不起作用