Android 从 onActivityResult 获取文件名和路径

Owe*_*Nel 3 android file path

我正在努力实现什么目标。我有一个button,当单击按钮时,应用程序会打开一个文件选择器,用户选择一个文件。然后,应用程序使用 aFileInputStream读取文件并生成byte[]. 我TextView下面有一个button,然后将简单地显示byte[].length. 这是事件中的代码button.onClick()

\n\n
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);\n    intent.addCategory(Intent.CATEGORY_OPENABLE);\n    intent.setType("*/*");\n\n    requestFilePickerCode = parent.registerActivityResultListener(this);\n    try\n    {\n        parent.startActivityForResult(intent, requestFilePickerCode);\n    }\n    catch (ActivityNotFoundException e)\n    {\n        Toast.makeText(task.getParent(), "Please install a file manager", Toast.LENGTH_SHORT).show();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在这段代码可以工作,并且我已经确认它onActivityResult在选择文件时会触发。我只需打印 aLog来显示,data.toString()它会产生以下输出:

\n\n
11-02 15:14:36.196 2535-2535/? V/class\xc2\xa0za.co.gpsts.gpsjobcard.utility.handlers.PebbleTypeHandlerBinary: -----> content:/com.android.providers.downloads.documents/document/1\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以它似乎正在获取选定的文件。当我运行应用程序并选择一个文件时,它会抛出我的自定义错误:

\n\n
11-02 15:14:36.196 2535-2535/? E/class\xc2\xa0za.co.gpsts.gpsjobcard.utility.handlers.PebbleTypeHandlerBinary: -----> File does not exist\n
Run Code Online (Sandbox Code Playgroud)\n\n

这显然表明我没有收到该文件。这是我的代码:

\n\n
@Override\npublic boolean onActivityResult(int requestCode, int resultCode, Intent data)\n{\n    byte[] fileContent;\n\n    // check that data is not null and assign to file if not null\n    if (data != null)\n    {\n        Uri uri = data.getData();\n        String uriString = uri.toString();\n        file = new File(uriString);\n\n        Log.v(PebbleTypeHandlerBinary.class.toString(), "-----> " + file.toString());\n\n        // declare file input stream and read bytes\n        // write to string variable to test and test output\n        FileInputStream fin = null;\n        try\n        {\n            fin = new FileInputStream(file);\n            fileContent = new byte[(int) file.length()];\n\n            fin.read(fileContent);\n            String test = new String(fileContent);\n            Log.v(PebbleTypeHandlerBinary.class.toString(), "=====> " + test);\n        }\n        catch (FileNotFoundException e)\n        {\n            Toast.makeText(task.getParent(), "File not found", Toast.LENGTH_SHORT).show();\n            Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> File does not exist");\n        }\n        catch (IOException e)\n        {\n            Toast.makeText(task.getParent(), "Error reading file", Toast.LENGTH_SHORT).show();\n            Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> Error while reading the file");\n        }\n        finally\n        {\n            // close the file input stream to stop mem leaks\n            try\n            {\n                if (fin != null)\n                {\n                    fin.close();\n                }\n            } catch (IOException e)\n            {\n                Log.e(PebbleTypeHandlerBinary.class.toString(), "-----> Error closing the stream");\n            }\n        }\n\n        Log.v(PebbleTypeHandlerBinary.class.toString(), data.toString());\n    }\n\n    return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

请你们检查我的代码并帮助我完成这项工作。任何帮助,将不胜感激。

\n

Abd*_*aid 5

/* 你可以用这个方法得到名字和大小。

  • 使用光标。
  • uri uri = data.getData();
  • 从 onActivityResult() 获取数据 */;

游标cursor = getContentResolver().query(uri, null, null, null, null);

    int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
    int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
    cursor.moveToFirst();

    String name = cursor.getString(nameIndex);
    String size = Long.toString(cursor.getLong(sizeIndex));

    Toast.makeText(this, "name : "+name+"\nsize : "+size, Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)