Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。
//intent.setType(“audio/*”); //选择音频
//intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
//intent.setType(“video/*;image/*”);//同时选择视频和图片
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, 1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {//是否选择,没选择就不会继续
Uri uri = data.getData();//得到uri,后面就是将uri转化成file的过程。
String[] proj = {MediaStore.Images.Media.DATA};
Cursor actualimagecursor = managedQuery(uri, proj, null, null, null);
int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
actualimagecursor.moveToFirst();
String img_path = actualimagecursor.getString(actual_image_column_index);
File file = new File(img_path);
Toast.makeText(OpenFile.this, file.toString(), Toast.LENGTH_SHORT).show();
String dd =file.toString();
pathEt.setText(file.toString());
filename=pathEt.getText().toString(); //得到文件路径
}
}
在操作前,自己在软件中保存了蓝牙串口读取到的数据作为这一步操作的文件,但是除了开始第一个文件,后续保存的文件都会导致活动崩溃。具体报错如下:
01-05 15:51:55.726 14887-14887/com.example.administrator.project E/MemoryLeakMonitorManager: MemoryLeakMonitor.jar is not exist!
01-05 15:51:55.727 14887-14887/com.example.administrator.project E/Minikin: Could not get cmap table size!
01-05 15:52:08.370 14887-14887/com.example.administrator.project E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.administrator.project, PID: 14887
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.huawei.hidisk.fileprovider/root/storage/emulated/0/data/aaa.txt typ=text/plain flg=0x3 }} to activity {com.example.administrator.project/com.example.administrator.project.OpenFile}: java.lang.IllegalArgumentException: column '_data' does not exist
at android.app.ActivityThread.deliverResults(ActivityThread.java:4932)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4975)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1950)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Caused by: java.lang.IllegalArgumentException: column '_data' does not exist
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:333)
at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:87)
at com.example.administrator.project.OpenFile.onActivityResult(OpenFile.java:81)
at android.app.Activity.dispatchActivityResult(Activity.java:7690)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4928)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4975)
at android.app.ActivityThread.-wrap20(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1950)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loop(Looper.java:166)
at android.app.ActivityThread.main(ActivityThread.java:7425)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
以下是保存文件的方法:
private void Save() {
//显示对话框输入文件名
LayoutInflater factory = LayoutInflater.from(MainActivity.this); //图层模板生成器句柄
final View DialogView = factory.inflate(R.layout.sname, null); //用sname.xml模板生成视图模板
new AlertDialog.Builder(MainActivity.this)
.setTitle("文件名")
.setView(DialogView) //设置视图模板
.setPositiveButton("确定",
new DialogInterface.OnClickListener() //确定按键响应函数
{
public void onClick(DialogInterface dialog, int whichButton){
EditText text1 = (EditText)DialogView.findViewById(R.id.sname); //得到文件名输入框句柄
filename = text1.getText().toString(); //得到文件名
try{
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //如果SD卡已准备好
filename =filename+".txt"; //在文件名末尾加上.txt
File sdCardDir = Environment.getExternalStorageDirectory(); //得到SD卡根目录
File BuildDir = new File(sdCardDir, "/data"); //打开data目录,如不存在则生成
if(BuildDir.exists()==false)BuildDir.mkdirs();
File saveFile =new File(BuildDir, filename); //新建文件句柄,如已存在仍新建文档
FileOutputStream stream = new FileOutputStream(saveFile); //打开文件输入流
stream.write(fmsg.getBytes());
stream.close();
Toast.makeText(MainActivity.this, "存储成功!\n\r"+saveFile, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(MainActivity.this, "没有存储卡!", Toast.LENGTH_LONG).show();
}
}catch(IOException e){
return;
}
}
})
.setNegativeButton("取消", //取消按键响应函数,直接退出对话框不做任何处理
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).show(); //显示对话框
}
解决方法:
保存完文件后,加上
MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null);
解决问题
参考https://blog.csdn.net/saharis/article/details/38818519 帖子