通过'ContentResolver'删除文件,而不是通过'file.delete()'删除它们

我刚刚在一个android应用程序中编写了一个函数,它使用Java中的标准“文件”类删除文件。 即:

String fileName= "/mnt/Gallery/Img001.jpg"; File file = new File(fileName); file.delete(); 

虽然上面的过程很简单,但我一直在想,是否有任何优势,通过“ContentResolver”做同样的事情。 任何意见,将不胜感激。

干杯,

Jarryd

—————————————— EDIT ——- ———————————

以下是通过Content Resolver删除文件的示例。 这个例子假设被删除的文件是一个图像,并且它的“id”是已知的。

 long mediaId = 155; // NOTE: You would normally obtain this from the content provider! Uri contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Uri itemUri = ContentUris.withAppendedId(contentUri, mediaId); int rows = getContentResolver().delete(itemUri, null, null); String path = itemUri.getEncodedPath(); if(rows == 0) { Log.e("Example Code:","Could not delete "+path+" :("); } else { Log.d("Example Code:","Deleted "+path+ " ^_^"); } 

Solutions Collecting From Web of "通过'ContentResolver'删除文件,而不是通过'file.delete()'删除它们"

与直接操作数据相比,Android的内容提供者框架具有一定的附加优势。

您可以按照“文件在哪里,谁在删除”来思考。

情况1

文件驻留在SD卡(您的应用程序可访问的path),你的应用程序正在删除它。

解决scheme:由于path是可以访问的,所以java方法将使用一个Uri文件,如:

文件://mnt/sdcard/downloads/image.jpeg

情景2

文件驻留在另一个应用程序(比如说dropbox),你的应用程序需要删除该文件。

解决scheme :这意味着该文件实际上驻留在另一个应用程序的私人存储中。 一个文件:Uri上面的方法会给你拒绝访问。 因此,您的应用程序需要从包含该文件的应用程序获取内容Uri,并调用其内容提供程序进行删除。

fileUri = Uri.parse(“content://”+ packageContainingTheFile“+ fileId); //将其replace为从应用程序中获得的Uri getContext()。getContentResolver()。delete(fileUri,null,null);

情景3

文件驻留在你的应用程序的包目录下,即data / data / com.yourpackage / yourfolder / yourfile.xxx,你的应用程序是唯一的一个删除它。

解决scheme:在这里,上述任何一种方法都可以工作,因为您有权删除文件。 Uri看起来像:

文件://data/data/yourpackage/folder/file.ext

在这里使用内容提供者的主要优点是你自动获得观察者模型。 内容提供者callback是数据被修改的一个明确的入口点。 因此,它是一个期望的地方,以通知其他人的变化使用:

getContext()。getContentResolver()。notify(uri,null)

假设您有意见显示这些文件项目的列表。 一旦删除完成,您可以通知。

场景4

文件驻留在你的应用程序的包目录中,即在data / data / com.yourpackage / yourfolder / yourfile.xxx下,并且想要将删除function公开给其他应用程序。

解决scheme :这与scheme1类似,只是相反。 其他应用程序无法删除您的私人存储与Uri喜欢的文件

file://data/data/yourpackage/folder/file.ext //仅适用于您的应用程序

他们将需要打电话给你的内容提供商与Uri喜欢做这个。

内容:// providerAuthority / delete / id你的内容提供者将需要映射到file.ext绝对path。

概要

总而言之,内容提供者的使用是必要的,而在其他情况下是可选的。 这很大程度上取决于您的应用程 如果您有意见,CursorLoaders已经到位,并希望获得有关更新的通知或希望将您的应用程序数据删除到其他应用程序,内容提供商是最干净的方法。