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+ " ^_^"); }
解决方法
情景1
文件位于SD卡(您的应用可访问的路径),您的应用正在删除它.
解决方案:由于您可以访问该路径,因此java方法将与文件Uri一起使用:
file://mnt/sdcard/downloads/image.jpeg
@H_403_31@情景2
文件位于另一个应用程序(称为DropBox)中,您的应用程序需要删除该文件.
解决方案:这意味着该文件实际上位于另一个应用程序的私人存储中.一个文件:Uri将上面的方法会给你访问被拒绝.所以,您的应用程序将需要从包含该文件的应用程序中获取内容Uri,并调用其内容提供商进行删除.
fileUri = Uri.parse (“content : // ” + packageContainingTheFile ” + fileId); // replace this with Uri obtained from the app.
@H_403_31@
getContext().getContentResolver().delete (fileUri,null);情景3
文件位于您的应用程序包目录中,即data / data / com.yourpackage / yourfolder / yourfile.xxx下,您的应用程序是唯一一个删除它.
解决方案:这里,上述两种方法都可以使用,因为您可以删除该文件.
乌里将看起来像:file://data/data/yourpackage/folder/file.ext
@H_403_31@在这里使用内容提供商的主要优点是您自动获得观察者模型.内容提供者回调是一个定义明确的入口点,从数据修改.因此,它是通过以下方式通知他人的一个理想的地方:
getContext().getContentResolver().notify(uri,null)
@H_403_31@情景4
文件位于您的应用程序包目录中,您要将删除功能公开于其他应用程序.
解决方案:这与场景1相似,只是相反.其他应用程序无法使用Uri删除私人存储中的文件
file://data/data/yourpackage/folder/file.ext // works just for your app
@H_403_31@他们需要打电话给您的内容提供商这样做与Uri像.
content://providerAuthority/delete/id
@H_403_31@
which your content provider will need to map to file.ext absolute path.概要
总而言之,内容提供者的使用是必要的,而在其他情况下是可选的.它在很大程度上取决于你的应用需求如果您有意见,CursorLoaders就位,想要了解更新,或希望将您的应用程序数据删除到其他应用程序,内容提供商是最干净的方法.