onActivityResult中的FileNotFoundException

时间:2017-11-14 20:11:54

标签: java android android-intent base64 fileinputstream

我试图只浏览两种文件类型:images或pdf。

以下是来源:

String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
            myPermissions =new MyPermissions(TestDialog.this, 0, permissions);
            MyPermissions.EventHandler permHandler = new MyPermissions.EventHandler() {
                @Override
                public void handle() {

                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    intent.setType("application/pdf");
                    intent.setType("image/jpeg");
                    startActivityForResult(intent, 0);
                }
            };

            myPermissions.doIfHasPermissions(permHandler);

这是我的onActivityResult来源:

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        String url = data.getData().getPath();
        File myFile = new File(url);
        Log.e("base64 ", getStringFile(myFile));


    }
    super.onActivityResult(requestCode, resultCode, data);
}

public String getStringFile(File f) {
    InputStream inputStream = null;
    String encodedFile = "", lastVal;
    try {
        inputStream = new FileInputStream(f.getAbsolutePath());

        byte[] buffer = new byte[10240];//specify the size to allow
        int bytesRead;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        Base64OutputStream output64 = new Base64OutputStream(output, Base64.DEFAULT);

        while ((bytesRead = inputStream.read(buffer)) != -1) {
            output64.write(buffer, 0, bytesRead);
        }
        output64.close();
        encodedFile = output.toString();
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    lastVal = encodedFile;
    return lastVal;
}

我想将所选文件转换为Base64,但我得到FileNotFoundException。有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

  

我尝试只浏览两个类型文件,图片或pdf

您的代码与文件无关。它使用ACTION_GET_CONTENT,允许用户选择一段内容。

String url = data.getData().getPath();

除非Uri的方案为file,否则此行无效。最有可能的是,它的计划为content

停止使用FileFileInputStream。相反,从InputStream(来自ContentResolver)及其getContentResolver()方法获取openInputStream()。您可以传递Uri,无论InputStream方案是Uri还是file,您都会获得content

另请注意,您的应用可能会因OutOfMemoryError而崩溃,但相当小的文件除外,因为您没有足够的堆空间来执行此转换。

答案 1 :(得分:1)

看看

Uri uri = data.getData(); 

然后尝试记录uri.toString()的值。

您会看到它以" content //...."。

开头

不要试图找到文件。

而不是FileInputStream使用InputStream。

InputStream inputStream = getContentResolver().openInputStream(uri);