代码之家  ›  专栏  ›  技术社区  ›  Daniele

如何将内容Uri转换为文件

  •  11
  • Daniele  · 技术社区  · 7 年前

    这是我的代码:

    ACTION_GET_CONTENT 在我的 onCreate()

    Intent selectIntent = new Intent(Intent.ACTION_GET_CONTENT);
            selectIntent.setType("audio/*");
            startActivityForResult(selectIntent, AUDIO_REQUEST_CODE);
    

    检索 Uri onActivityResult()

    @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == AUDIO_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
                if ((data != null) && (data.getData() != null)) {
                    audio = data.getData();
                }
            }
        }
    

    Uri 到另一个活动并检索它

    Intent debugIntent = new Intent(this, Debug.class);
                Bundle bundle = new Bundle();
                bundle.putString("audio", audio.toString());
                debugIntent.putExtras(bundle);
                startActivity(debugIntent);
    
    Intent intent = this.getIntent();
            Bundle bundle = intent.getExtras();
            audio = Uri.parse((String) bundle.get("audio"));
    

    我已经基于另一个SO答案实现了这个方法。获取Uri的实际路径

    public static String getRealPathFromUri(Activity activity, Uri contentUri) {
            String[] proj = { MediaStore.Audio.Media.DATA };
            Cursor cursor = activity.managedQuery(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
    

    onCreate()

    File audioFile = new File(getRealPathFromUri(this, audio));
    

    这是错误的样子:

    原因:java.lang.NullPointerException

    当我运行应用程序时,我在最后一行得到一个NPE。音频Uri不是空的,所以我不明白是什么引起的。

    如果你能帮助我,我将不胜感激。

    This is the library 我试着和你一起工作。

    注: 我确切地知道NPE是什么,但即使是调试,我也无法从这个特定案例中找出它的原因。

    3 回复  |  直到 7 年前
        1
  •  9
  •   CommonsWare    7 年前

    将Uri传递给另一个活动并检索它

    Uri 添加 FLAG_GRANT_READ_URI_PERMISSION Intent Uri 通过 ( setData()

    获取Uri的实际路径

    Uri MediaStore

    第二 managedQuery() 已被弃用 六年 .

    第三,没有要求路径 有一个你可以使用的。例如,音频文件可能位于可移动存储器上,而 媒体商店 你不能访问它。

    如何将内容Uri转换为文件

    • 获取 ContentResolver getContentResolver() Context
    • openInputStream() 内容解析器 Uri 您从中获得的 ACTION_GET_CONTENT ,以获得 InputStream Uri
    • 创建 FileOutputStream File ,您希望将内容存储在其中
    • 使用Java I/O从 输入流 文件输出流 ,完成后关闭两个流
        2
  •  0
  •   Amin Keshavarzian    5 年前

    我在Android Q上遇到了同样的问题,所以我最终创建了一个新文件,并使用内容的输入流来填充该文件

    private var pdfFile: File? = null
    
        override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
            if (resultCode == Activity.RESULT_OK) {
                if (data != null) {
                    when (requestCode) {
                        REQUEST_CODE_DOC -> {
                            data.data?.let {
                                if (it.scheme.equals("content")) {
                                    val pdfBytes =
                                        (contentResolver?.openInputStream(it))?.readBytes()
                                    pdfFile = File(
                                        getExternalFilesDir(null),
                                        "Lesson ${Calendar.getInstance().time}t.pdf"
                                    )
    
                                    if (pdfFile!!.exists())
                                        pdfFile!!.delete()
                                    try {
                                        val fos = FileOutputStream(pdfFile!!.path)
                                        fos.write(pdfBytes)
                                        fos.close()
                                    } catch (e: Exception) {
                                        Timber.e("PDF File", "Exception in pdf callback", e)
                                    }
                                } else {
                                    pdfFile = it.toFile()
                                }
    
                            }
                        }
                    }
                }
            }
        }
    
        3
  •  -1
  •   OneCricketeer    6 年前

    Daniele,您可以直接从onActivityResult()中的以下数据中获取文件路径:

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