已解决:intent调用系统管理器获取文件路径问题

     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 帖子

你可能感兴趣的:(问题)