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)
函数永远不会被调用,因此 filepath
和 filename
永远不会被分配,这会产生异常。但是我不确定我是否正确检测到问题,我不知道如何解决它。
这是我的主要 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);
我正在尝试为 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)
函数永远不会被调用,因此 filepath
和 filename
永远不会被分配,这会产生异常。但是我不确定我是否正确检测到问题,我不知道如何解决它。
这是我的主要 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);