Android java 中的应用程序在尝试打开文本文件时崩溃

Android app in java crashes when trying to open a text file

我正在尝试为 Java 中的 Android 制作一个简单的文本编辑器。我 运行 在尝试打开文件时遇到问题。

在我的这行代码中

File file = new File(getExternalFilesDir(filepath), filename);

我得到一个空指针异常:

 java.lang.NullPointerException: name == null
        at java.io.File.<init>(File.java:150)
        at java.io.File.<init>(File.java:124)
        at my.app.texteditor.MainActivity.onClick(MainActivity.java:31)

我的应用程序崩溃了,让我的 android 设备上的文件选择器保持打开状态。

对我来说(在尝试调试我的代码一段时间后)似乎

protected void onActivityResult(int requestCode, int resultCode, Intent data)

函数永远不会被调用,因此 filepathfilename 永远不会被分配,这会产生异常。但是我不确定我是否正确检测到问题,我不知道如何解决它。

这是我的主要 activity 的(完整)代码 - 我试图打开文件的代码:

package my.app.texteditor;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

import java.io.File;

public class MainActivity extends AppCompatActivity {
    String filepath, filename, folder;
    private static final int PICKFILE_RESULT_CODE = 1;
    private static int PICKER_RESULT = -1;

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

        Button OpenButton = (Button) findViewById(R.id.OpenButton);
        OpenButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent getContent = new Intent(Intent.ACTION_GET_CONTENT);
                getContent.setType("text/*");
                startActivityForResult(getContent, PICKFILE_RESULT_CODE);
                
                    File file = new File(getExternalFilesDir(filepath), filename);
                    Intent openIntent = new Intent(MainActivity.this, ShowFile.class);
                    openIntent.putExtra("my.app.file", file);
                    startActivity(openIntent);

            }
        });

        Button NewButton = (Button) findViewById(R.id.NewButton);
        NewButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent newIntent = new Intent(MainActivity.this, ShowFile.class);
                startActivity(newIntent);
            }
        });

        if (!StorageHandler.isExternalStorageAvailable() || StorageHandler.isExternalStorageReadOnly()) {
            OpenButton.setEnabled(false);
        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        PICKER_RESULT = resultCode;
        if (requestCode == PICKFILE_RESULT_CODE) {
            if (resultCode == RESULT_OK) {
                filepath = data.getData().getPath();
                filename = data.getData().getLastPathSegment();
                int lastPos = filepath.length() - filename.length();
                folder = filepath.substring(0, lastPos);
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }


}

当我放置这部分代码时:

File file = new File(getExternalFilesDir(filepath), filename);
Intent openIntent = new Intent(MainActivity.this, ShowFile.class);
openIntent.putExtra("my.app.file", file);
startActivity(openIntent);

在 if 语句中,因此仅当 PICKER_RESULT 变量在 onActivityResult 函数中更改时才会执行 - 如下所示:

 if(PICKER_RESULT!=-1) {
                    File file = new File(getExternalFilesDir(filepath), filename);
                    Intent openIntent = new Intent(MainActivity.this, ShowFile.class);
                    openIntent.putExtra("my.app.file", file);
                    startActivity(openIntent);
                }

然后我的 android 设备打开文件选择器,应用程序没有崩溃,但我无法打开文件 - PICKER_RESULT 仍设置为 -1。

所以我的问题是,为什么 onActivityResult 函数从未被调用过?

您正在尝试在 onClick 事件处理程序中使用 activity 的结果。这将不起作用,因为 activity 是异步启动的。事件处理程序将保持 运行 直到结束,然后才开始 activity。

所有依赖于 activity 结果的代码都应该在 onActivityResult(或从中调用的方法)

startActivityForResult(getContent, PICKFILE_RESULT_CODE);

// MOVE THIS TO onActivityResult                
File file = new File(getExternalFilesDir(filepath), filename);
Intent openIntent = new Intent(MainActivity.this, ShowFile.class);
openIntent.putExtra("my.app.file", file);
startActivity(openIntent);