【问题标题】:FileNotFoundException in android file pickerandroid 文件选择器中的 FileNotFoundException
【发布时间】:2015-05-07 11:01:44
【问题描述】:

我想将文件从移动存储(内部和外部存储)上传到服务器。通过使用文件选择器,我得到了FileNotFoundException。这是我的代码的 sn-p:

public void openFileSystem(){
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    startActivityForResult(Intent.createChooser(intent, "Select file to upload."), SELECT_FILE);
}

这是我的onActivityResult()getPath()

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

    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SELECT_FILE && resultCode == Activity.RESULT_OK) {

        Uri path = data.getData();
        String url = data.getData().getPath();
        File file = new File(url);
        int size = (int) file.length();
        byte[] bytes = new byte[size];
        try {
            BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
            buf.read(bytes, 0, bytes.length);
            buf.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if(cursor!=null)
        {
            int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
        else return null;
    }

错误日志:

05-07 06:41:03.087: W/System.err(2195): java.io.FileNotFoundException: /document/2: open failed: ENOENT (No such file or directory)
05-07 06:41:03.097: W/System.err(2195):     at libcore.io.IoBridge.open(IoBridge.java:409)
05-07 06:41:03.097: W/System.err(2195):     at java.io.FileInputStream.<init>(FileInputStream.java:78)
05-07 06:41:03.097: W/System.err(2195):     at com.gems.ComposeBulletin.onActivityResult(ComposeBulletin.java:121)
05-07 06:41:03.117: W/System.err(2195):     at android.app.Activity.dispatchActivityResult(Activity.java:5423)
05-07 06:41:03.117: W/System.err(2195):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3361)
05-07 06:41:03.127: W/System.err(2195):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3408)
05-07 06:41:03.137: W/System.err(2195):     at android.app.ActivityThread.access$1300(ActivityThread.java:135)
05-07 06:41:03.137: W/System.err(2195):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
05-07 06:41:03.137: W/System.err(2195):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-07 06:41:03.157: W/System.err(2195):     at android.os.Looper.loop(Looper.java:136)
05-07 06:41:03.157: W/System.err(2195):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-07 06:41:03.167: W/System.err(2195):     at java.lang.reflect.Method.invokeNative(Native Method)
05-07 06:41:03.167: W/System.err(2195):     at java.lang.reflect.Method.invoke(Method.java:515)
05-07 06:41:03.177: W/System.err(2195):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-07 06:41:03.187: W/System.err(2195):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-07 06:41:03.187: W/System.err(2195):     at dalvik.system.NativeStart.main(Native Method)
05-07 06:41:03.197: W/System.err(2195): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
05-07 06:41:03.217: W/System.err(2195):     at libcore.io.Posix.open(Native Method)
05-07 06:41:03.217: W/System.err(2195):     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
05-07 06:41:03.227: W/System.err(2195):     at libcore.io.IoBridge.open(IoBridge.java:393)

所以我的座右铭是从内部存储或外部存储中选择任何文件(imagepdfdoc)并将其上传到服务器上。任何帮助将不胜感激!

【问题讨论】:

  • 从 logcat 发布堆栈跟踪。
  • 发布 logcat 并查看它,因为它准确地告诉您哪个状态导致 NullPointerException。请告诉我们那行代码是什么。哪个指针为空。
  • 文件大小为 0,但我得到了文件的路径。所以无法弄清楚为什么会这样。 .
  • 您是否设置了正确的&lt;uses-permission&gt; 来读取该文件?
  • 它在 FileInputStream 中给出了 FileNotFoundException

标签: java android filenotfoundexception filechooser


【解决方案1】:

ACTION_GET_CONTENT 不可靠,因为不要求 Uri 返回指向您可以访问的文件。该文件可能位于应用程序的内部存储中,也可能位于可移动媒体上,甚至可能位于某个地方的云中。对于这周的第六次时间,绝对是过去十分钟内的第二次......a Uri is not a file

按设计使用Uri,通过ContentResolver 上的方法,如openInputStream()getType()

【讨论】:

    【解决方案2】:

    试试这个...

     Browse = (ImageView)findViewById(R.id.browsehoro);
        Browse.setOnClickListener(this); 
    
     public void onClick(View v)
    {
    
        switch(v.getId())
        {
    
        case R.id.browsehoro:
            img.setEnabled(true);
            Intent intent = new Intent(Horoscope.this, FilePickerHoroscope.class);            
            startActivityForResult(intent, REQUEST_PICK_FILE);
            break;
        }
    
    
    }
    
     @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
    
        if (resultCode == RESULT_OK) {
           /* if (requestCode == REQUEST_PICK_FILE) {
                Uri selectedImageUri = data.getData();
                selectedFile = getPath(selectedImageUri);
    
     //                Print imagepath in textview here
                filePath.setText(selectedFile);
                System.out.println(requestCode);
                System.out.println("Image Path : " + selectedFile);
                img.setImageURI(selectedImageUri);
    
    
            }*/
    
    
            switch(requestCode) 
            {
    
            case REQUEST_PICK_FILE:
    
                if(data.hasExtra(FilePickerHoroscope.EXTRA_FILE_PATH))
                 {
                    selectedFile = new String
                            (data.getStringExtra(FilePickerHoroscope.EXTRA_FILE_PATH));
                    filePath.setText(selectedFile.toString());  
                }
                break;
            }
        }
    }
    

    【讨论】:

      【解决方案3】:
      String url = data.getData().getPath();
      File file = new File(url);
      

      字符串 url 确实包含内容提供程序路径。在这种情况下,您可以在 logcat /document/2 中看到。 File 类无法处理此类内容提供程序路径。

      您首先必须将该路径转换为真实的文件系统路径。

      谷歌搜索“getRealPathFromUri”。

      【讨论】:

      • getRealPathFromUri()(及其后代)是由一个流口水的白痴写的。它对 Android 内容做出了无效的假设。这些假设在一开始是不必要的,但碰巧奏效了,因此这种模式得到了传播。然而,这些假设现在完全是错误的,使用 getRealPathFromUri() 风格技术的应用程序在使用其他确实遵守规则并使用支持的方法(如 FileProvider)共享内容的应用程序时会崩溃.请停止宣传这种技术。
      • 相当苛刻。 getRealPathFromUri 可以返回我们知道的 null ,因此无需中断。获取“真实路径”(.DATA) 的技术与获取 .DISPLAY_NAME 和 .SIZE 的技术相同。那么为什么会是这样的错误呢?我当然知道uri方式是要走的路。但是,如果使用文件选择器,那么想知道文件系统上文件的路径并不是一个坏主意。
      • "获取“真实路径”(.DATA) 的技术与获取 .DISPLAY_NAME 和 .SIZE 的技术相同——DISPLAY_NAMESIZEOpenableColumns 合同。 DATA 不是。 “那为什么会这样呢?” -- 首先,并非ACTION_GET_CONTENT 的每个受访者都是MediaStore。如果用户为ACTION_GET_CONTENT 选择了一个不受MediaStore 支持的活动(例如,Dropbox、Google Drive),那么Uri 没有文件系统路径。
      • 其次,并非文件系统上可能对MediaStore 可见的每个文件都可以被应用程序访问。可移动媒体是一个典型的例子:虽然MediaStore 本身可以访问所有可移动媒体,但应用程序不能,尤其是在 Android 4.4+ 上。 “但如果有人使用文件选择器”——ACTION_GET_CONTENT 不是“文件选择器”。
      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 2012-03-13
      相关资源
      最近更新 更多