Android-如何从外部存储设备读取文本文件

时间:2020-09-15 13:51:08

标签: java android

我是Android Studio的新手,尝试运行以下代码以访问和读取.txt文件,并相应地从外部存储设置我的textView区域。您可以在下面看到该问题的详细说明;

package simple_bluetooth_terminal;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.FragmentManager;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import com.jjoe64.graphview.GraphView;
import com.jjoe64.graphview.series.DataPoint;
import com.jjoe64.graphview.series.LineGraphSeries;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener {

    private static final int PERMISSION_REQUEST_STORAGE = 1000;
    private static final int READ_REQUEST_CODE = 42;
    Button b_load;
    TextView tv_output;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
        {
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_STORAGE);
        }

        b_load = (Button) findViewById(R.id.read);
        tv_output = (TextView) findViewById(R.id.textView);
        b_load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            performFileSearch();
            }
        });
        setSupportActionBar(toolbar);
        getSupportFragmentManager().addOnBackStackChangedListener(this);
        if (savedInstanceState == null)
            getSupportFragmentManager().beginTransaction().add(R.id.fragment, new DevicesFragment(), "devices").commit();
        else
            onBackStackChanged();
    }

    private String readText (String input) {
        File file = new File (Environment.getExternalStorageDirectory(),input);
        StringBuilder text = new StringBuilder();
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));

            String line;
            while ((line=br.readLine())!=null){
                text.append(line);
                System.out.println(line);
                text.append("\n");
            }
            br.close();
        }catch (IOException e){
            e.printStackTrace();
            Log.e("Exception caught", e.toString());
        }
        return text.toString();
    }

  
    private void performFileSearch (){
        Intent intent = new Intent (Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("text/*");
        startActivityForResult(intent, READ_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            if (data != null) {
                Uri uri = data.getData();
                String path = uri.getPath();
                if (path.contains("emulated")) {
                    path = path.substring(path.indexOf("0") + 1);
                }
                path = path.substring(path.indexOf(":") + 1);
                Toast.makeText(this, "" + path, Toast.LENGTH_SHORT).show();
                tv_output.setTextColor(Color.RED);
                String s = "abc";

                tv_output.setText(readText(path));
                System.out.println("read loop activated");
                System.out.println(s);
                System.out.println(readText(path));

            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode== PERMISSION_REQUEST_STORAGE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
            {
                Toast.makeText(this, "Permission granted!", Toast.LENGTH_SHORT).show();
                System.out.println("Permission Granted");
            } else{
                Toast.makeText(this, "Permission not granted!", Toast.LENGTH_SHORT).show();
                System.out.println("Permission Granted");
                finish();
            }
        }
    }

    @Override
    public void onBackStackChanged() {
        getSupportActionBar().setDisplayHomeAsUpEnabled(getSupportFragmentManager().getBackStackEntryCount()>0);
    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

}

我可以访问该文件并查看目录,但是textView中未设置文本文件中的字符串。

不久,performFileSearch()可以正常工作,但是readText(字符串输入)不起作用。 LOGCAT在以下几行中显示错误;

  1. BufferedReader br =新的BufferedReader(新的FileReader(文件));
  2. tv_output.setText(readText(path));

和FileNotFound异常由于有问题的BufferedReader行而发生,如下所示;

java.io.FileNotFoundException:/ storage / emulated / 0 / document / acc = 1; doc = encoded = yGpDfmZooF + Ikc2k92OckqR7fUXB5WDXoFvDOrmxSLkLTN2N2r8 =(没有这样的文件或目录)

我已经在AndroidManifest.xml中包含了权限;

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

您可以在下面查看日志,我们将不胜感激。

2020-09-15 16:26:00.442 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err: java.io.FileNotFoundException: /storage/emulated/0/document/acc=1;doc=encoded=yGpDfmZooF+Ikc2k92OckqR7fUXB5WDXoFvDOrmxSLkLTN2N2r8= (No such file or directory)
2020-09-15 16:26:00.442 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.io.FileInputStream.open(Native Method)
2020-09-15 16:26:00.442 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:146)
2020-09-15 16:26:00.442 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.io.FileReader.<init>(FileReader.java:72)
2020-09-15 16:26:00.442 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at de.kai_morich.simple_bluetooth_terminal.MainActivity.readText(MainActivity.java:74)
2020-09-15 16:26:00.442 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at de.kai_morich.simple_bluetooth_terminal.MainActivity.onActivityResult(MainActivity.java:114)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:7010)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:4187)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4234)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.-wrap20(ActivityThread.java)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1584)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.os.Looper.loop(Looper.java:154)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6316)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
2020-09-15 16:26:00.443 24764-24764/de.kai_morich.simple_bluetooth_terminal E/Exception caught: java.io.FileNotFoundException: /storage/emulated/0/document/acc=1;doc=encoded=yGpDfmZooF+Ikc2k92OckqR7fUXB5WDXoFvDOrmxSLkLTN2N2r8= (No such file or directory)
2020-09-15 16:26:00.444 24764-24764/de.kai_morich.simple_bluetooth_terminal I/System.out: read loop activated
2020-09-15 16:26:00.444 24764-24764/de.kai_morich.simple_bluetooth_terminal I/System.out: abc
2020-09-15 16:26:00.447 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err: java.io.FileNotFoundException: /storage/emulated/0/document/acc=1;doc=encoded=yGpDfmZooF+Ikc2k92OckqR7fUXB5WDXoFvDOrmxSLkLTN2N2r8= (No such file or directory)
2020-09-15 16:26:00.447 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.io.FileInputStream.open(Native Method)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:146)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.io.FileReader.<init>(FileReader.java:72)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at de.kai_morich.simple_bluetooth_terminal.MainActivity.readText(MainActivity.java:74)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at de.kai_morich.simple_bluetooth_terminal.MainActivity.onActivityResult(MainActivity.java:117)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.Activity.dispatchActivityResult(Activity.java:7010)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.deliverResults(ActivityThread.java:4187)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.handleSendResult(ActivityThread.java:4234)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.-wrap20(ActivityThread.java)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1584)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.os.Looper.loop(Looper.java:154)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6316)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
2020-09-15 16:26:00.448 24764-24764/de.kai_morich.simple_bluetooth_terminal W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
2020-09-15 16:26:00.449 24764-24764/de.kai_morich.simple_bluetooth_terminal E/Exception caught: java.io.FileNotFoundException: /storage/emulated/0/document/acc=1;doc=encoded=yGpDfmZooF+Ikc2k92OckqR7fUXB5WDXoFvDOrmxSLkLTN2N2r8= (No such file or directory)
2020-09-15 16:26:00.472 24764-24787/de.kai_morich.simple_bluetooth_terminal D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000
2020-09-15 16:26:00.498 24764-24787/de.kai_morich.simple_bluetooth_terminal D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000
2020-09-15 16:26:00.544 24764-24764/de.kai_morich.simple_bluetooth_terminal I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@249dda8 time:23517629

2 个答案:

答案 0 :(得分:0)

在安装文件管理器(ES File Manager |文件资源管理器)之后,我能够读取.txt文件并相应地设置textView。您需要第三方文件管理器。

答案 1 :(得分:0)

 Uri uri = data.getData();

现在直接在呼叫中使用该uri

 readText(uri);

然后在该函数中,readText(Uri uri)打开一个InputStream而不是那个FileReader。

 InputStream is = getContentResolver().openInputStream(uri);

然后从中读取就像您从文件读取器中尝试过的一样。

BufferedReader br = new BufferedReader(is);