Android 如何删除从Java代码传递的本机代码中的文件?

Android 如何删除从Java代码传递的本机代码中的文件?,android,android-ndk,android-10.0,Android,Android Ndk,Android 10.0,我正在调整我的Android应用程序(Java+native)的代码,以适应Android 10范围的存储更改 我在清单中声明了所需的权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 现在,本机端读取/写入文件。并负责关闭文件描述符 我的问题是如何通过本机代码删除该文件 通常,为了删除文件,需要向其传递路径名(remove(),unlink()函数将其作为参数)。对于Ur

我正在调整我的Android应用程序(Java+native)的代码,以适应Android 10范围的存储更改

我在清单中声明了所需的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
现在,本机端读取/写入文件。并负责关闭文件描述符

我的问题是如何通过本机代码删除该文件

通常,为了删除文件,需要向其传递路径名(remove(),unlink()函数将其作为参数)。对于Uri,我无法做到这一点-我得到“没有这样的文件或目录”错误

谢谢。

谢谢,我意识到我需要重新思考我的应用程序设计。 因此,在本例中,我决定在Java端保留对DocumentFile的所有代码(包括删除),并在本机端使用read()/write()C函数(使用以前与Java分离的文件描述符)对文件进行读/写操作。就我而言,实际上是这样的:

  • Android应用程序:

    • 启动ACTION_OPEN_DOCUMENT_TREE来选择文档树,并将相应的树Uri传递给我的Android AAR库
    • 请求AAR库删除树Uri下的文件
  • AAR库(Java+本机):

    • 从传递的树Uri创建DocumentFile对象
    • 在文档树下创建文档文件,并将文件描述符传递给本机代码(应用程序不必知道任何有关实际文件的信息)
    • 删除文档文件

  • “我启动了ACTION\u OPEN\u DOCUMENT\u TREE让用户选择一个目录”--不,您让用户选择一个文档树。该树是否由银河系中任何计算机的文件系统上的目录表示,取决于用户选择的文档提供者的开发人员。“我要做的是在外部存储器上创建文件”--不,在文档树中创建文档。“我的问题是如何通过本机代码删除该文件?”--没有文件。但是,您可以安排本机代码在
    文档文件上调用
    delete()
    。谢谢。事实上,choosen文档树可以在任何地方。关于文件,我实际上在choosen文档树下创建了一个文件,并将其描述符传递给本机端。“不过,您可以安排您的本机代码在您的DocumentFile上调用delete()”—将尝试使用该方法,谢谢。我尝试在本机代码中调用DocumentFile对象上的delete(),效果很好!!再次感谢您。由于从本机代码调用
    delete()
    有点不寻常,如果您能发布您自己问题的答案,展示您最终使用的内容,那就太好了。不管怎样,我很高兴听到它为你工作!
    DocumentFile df = documentFile.createFile("text/plain", "my_file");
    ParcelFileDescriptor pfd = getApplicationContext().getContentResolver().openFileDescriptor(df.getUri(), "rw");
    myNativeFunction(pfd.detachFd());