Android:替代已弃用的 Context.MODE_WORLD_READABLE?

     2023-02-19     220

关键词:

【中文标题】Android:替代已弃用的 Context.MODE_WORLD_READABLE?【英文标题】:Android: Alternative to the deprecated Context.MODE_WORLD_READABLE? 【发布时间】:2012-12-01 03:51:09 【问题描述】:

From here我知道一种写入文件并可供其他应用程序和其他意图访问的方法,但现在 Context.MODE_WORLD_READABLE 已弃用,我该如何安全地完成此操作?

FileOutputStream out = myActivity.openFileOutput(fileTo, Context.MODE_WORLD_READABLE);

好的更多信息:

我正在使用这个:

intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");

而 uri 将是我将写入 sdcard 位置的那个。并且视频将来自应用程序,所以问题是,如果现在不允许这样做,我该如何编写文件并查看它。

【问题讨论】:

【参考方案1】:

文档似乎对此很清楚。

此常量在 API 级别 17 中已弃用。

创建世界可读的文件是非常危险的,并且可能导致 应用程序中的安全漏洞。强烈建议不要这样做;反而, 应用程序应该使用更正式的交互机制,例如 内容提供者、广播接收者和服务。没有 保证此访问模式将保留在文件上,例如当 它经过备份和恢复。文件创建模式:全部允许 其他应用程序对创建的文件具有读取权限。

【讨论】:

【参考方案2】:

而 uri 将是我将写入 sdcard 位置的那个。

默认情况下已经是MODE_WORLD_WRITABLE。另请注意,您列出的代码 (openFileOutput()) 确实 写入外部存储(您错误地称为“sdcard”)。 openFileOutput() 用于内部存储。

视频将来自应用程序,所以问题是,如果现在不允许这样做,我该如何编写文件并查看它。

如果您真的要将文件写入外部存储,只需使用指向该文件的Uri

如果您要将文件写入内部存储,请创建一个ContentProvider 来提供该文件,并使用一个Uri 指向该ContentProvider。 Here is a sample application 和 ContentProvider 在首次运行时从 assets/ 提取 PDF 文件,然后通过 openFile() 提供该文件,以便 PDF 查看器查看。

【讨论】:

谢谢。这很到位。 :D 如果视频文件已作为文件保存到内部存储(使用getCacheDir 给出的位置),您是说 ContentProvider 可以以某种方式为 VideoView 提供 URI,然后可播放?因为内部保存视频的直接 URI 不起作用(我猜是因为视频文件需要是世界可读的才能被视频视图播放,但如果在应用程序的私有内部缓存中则不是世界可读的)。跨度> @DanielSmith:“你是说 ContentProvider 可以以某种方式为 VideoView 提供一个 URI,然后可以播放?” - 视频很棘手,因为通常播放器需要一个可搜索的流(可以向前移动和向后),并且由ContentProvider 发布的流不可搜索。我不知道有任何视频格式可以使用只进流播放,尽管我还没有研究过这一点。 @CommonsWare:那么...是不是不能播放存储在内部缓存中的视频?关于这个主题有很多 SO 问题,但似乎没有一个有效的解决方案。我当前的工作解决方案将视频临时存储在外部缓存中,但仍然可以使用adb pull ... 提取它们,如果这些视频受到内部私有缓存的保护,我更愿意。想法? @DanielSmith:“那么......是否无法播放存储在内部缓存中的视频?” -- 如果你使文件可读(通过openFileOutput(),或API 级别9+ 上的setReadable(true)),它应该是可播放的。我听说有人设置 HTTP 守护程序来播放来自内部存储的视频,尽管这看起来很痛苦。而且由于任何人都可以通过生根进入内部存储,因此内部存储并不是一座坚不可摧的堡垒。【参考方案3】:

使用以下方法将视频保存在内存中:

openFileOutput("test.mp4", "MODE_PRIVATE");

然后这样做:

String path = context.getFilesDir().getAbsolutePath() + "/test.mp4"; // path to the root of internal memory.
File f = new File(path);
f.setReadable(true, false);
Intent playIntent ....
playIntent.setType("video/*");
playIntent.setData(Uri.fromFile(f));

祝你好运。

【讨论】:

谢谢你,这对我有帮助,不想将 sdcard 用于临时文件,请注意这是 Api 9 或更高版本,因此最终将 mode_world_readable 用于 Api 8,而 this 用于 9 及更高版本。 当然最好的选择是ContentProvider,在某些情况下这行不通。例如,即使我们为srt文件设置Readable,播放器也无法访问保存在视频文件相同位置并使用相同名称的srt文件。 @hasan83 如果我使用 FileOutputStream 将文件写入 data/data/com.****.***/myfolder,它不允许我以任何理由读取文件吗?跨度>

是否有快速替代已弃用的“SKPaymentTransaction.transactionReceipt”?

】是否有快速替代已弃用的“SKPaymentTransaction.transactionReceipt”?【英文标题】:Isthereafastreplacementfordeprecate`SKPaymentTransaction.transactionReceipt`?【发布时间】:2014-05-1513:41:45【问题描述】:是否有快速替代已弃用的SKPaymentTransaction.tran... 查看详情

BitmapDrawable 已弃用的替代方案

】BitmapDrawable已弃用的替代方案【英文标题】:BitmapDrawabledeprecatedalternative【发布时间】:2012-04-1606:11:56【问题描述】:我有以下代码可以将可绘制对象旋转一定的度数。publicDrawablerotateDrawable(floatangle,Contextcontext)BitmaparrowBitmap=Bitm... 查看详情

替代已弃用的 AudioManager.isWiredHeadsetOn?

】替代已弃用的AudioManager.isWiredHeadsetOn?【英文标题】:AlternativetothedeprecatedAudioManager.isWiredHeadsetOn?【发布时间】:2013-01-0207:43:44【问题描述】:方法AudioManager.isWiredHeadsetOn()从api级别14被弃用,我们现在如何检测是否连接了有线... 查看详情

已弃用的 AudioManger.setStreamMute 的替代方案?

】已弃用的AudioManger.setStreamMute的替代方案?【英文标题】:AlternativefordeprecatedAudioManger.setStreamMute?【发布时间】:2016-01-0812:48:11【问题描述】:AudioManger.setStreamMute现在被api23弃用,最好使用AudioManager.adjustStreamVolume和AudioManager.ADJU... 查看详情

已弃用的 NSURLConnection 方法,有替代方法吗?

】已弃用的NSURLConnection方法,有替代方法吗?【英文标题】:DeprecatedNSURLConnectionMethods,isthereanalternative?【发布时间】:2012-02-2814:12:26【问题描述】:我正在设置一个NSURLConnection来访问远程服务器:NSURL*url=[[NSURLalloc]initWithString:proj... 查看详情

寻找现在已弃用的 retryWhen 的替代方案

】寻找现在已弃用的retryWhen的替代方案【英文标题】:LookingforanalternativeofretryWhenwhichisnowDeprecated【发布时间】:2020-10-0616:34:43【问题描述】:我遇到了WebClient和reactor-extra的问题。确实,我有以下方法:publicEmployeegetEmployee(Stringemp... 查看详情

已弃用的 google plus api 的替代解决方案是啥?

】已弃用的googleplusapi的替代解决方案是啥?【英文标题】:Whatisthealternativesolutionofdeprecatedgoogleplusapi?已弃用的googleplusapi的替代解决方案是什么?【发布时间】:2019-06-2315:43:08【问题描述】:Google宣布在3月7日弃用所有googleplusapi... 查看详情

iOS 12.0 替代使用已弃用的 archiveRootObject:toFile:

】iOS12.0替代使用已弃用的archiveRootObject:toFile:【英文标题】:iOS12.0AlternativetoUsingDeprecatedarchiveRootObject:toFile:【发布时间】:2019-05-0322:47:12【问题描述】:在iOS12中,archiveRootObject:toFile:已被弃用。任何人都可以提出一种简化的替代... 查看详情

pymxs 替代已弃用的 MaxPlus 实用程序函数

】pymxs替代已弃用的MaxPlus实用程序函数【英文标题】:pymxsalternativestothedeprecatedMaxPlusutilityfunctions【发布时间】:2021-08-2400:11:17【问题描述】:随着Autodesk从3dsMax中删除MaxPlus,我现在不得不重新编写一些代码,并且想知道是否有... 查看详情

已弃用的 Hibernate.createClob(Reader reader, int length) 的替代方法是啥

】已弃用的Hibernate.createClob(Readerreader,intlength)的替代方法是啥【英文标题】:WhatisthealternatefordeprecatedHibernate.createClob(Readerreader,intlength)已弃用的Hibernate.createClob(Readerreader,intlength)的替代方法是什么【发布时间】:2012-02-1601:23:11【 查看详情

如何为已弃用的英特尔 IPP API 找到替代 API?

】如何为已弃用的英特尔IPPAPI找到替代API?【英文标题】:HowtofindalternativeAPIsfordeprecatedIntelIPPAPIs?【发布时间】:2014-11-0410:11:49【问题描述】:我正在与IntelIntegratedPerformancePrimitives(IntelIPP8.2)合作。我正在尝试使用来自UtilityFunction... 查看详情

[FFmpeg]啥是已弃用的 avpicture_alloc、avpicture::data 的替代品

】[FFmpeg]啥是已弃用的avpicture_alloc、avpicture::data的替代品【英文标题】:[FFmpeg]whatisreplacementsofavpicture_alloc,avpicture::datawhichweredeprecated[FFmpeg]什么是已弃用的avpicture_alloc、avpicture::data的替代品【发布时间】:2016-04-1204:47:35【问题描... 查看详情

channel 或 mutablesharedflow ,哪个是已弃用的 localbroadcastmanager 的更好替代品

...l或mutablesharedflow,哪个是已弃用的localbroadcastmanager的更好替代品【英文标题】:channelormutablesharedflow,whichoneisabetterreplacementfordeprecatedlocalbroadcastmanager【发布时间】:2021-04-0321:15:20【问题描述】:过去,我在聊天和出租车应用程序... 查看详情

Android getAllNetworkInfo() 已弃用。啥是替代方案?

】AndroidgetAllNetworkInfo()已弃用。啥是替代方案?【英文标题】:AndroidgetAllNetworkInfo()isDeprecated.Whatisthealternative?AndroidgetAllNetworkInfo()已弃用。什么是替代方案?【发布时间】:2015-11-2110:09:26【问题描述】:我想使用ConnectivityManager提... 查看详情

替代已弃用的 setup_environ() 一次性 django 脚本?

】替代已弃用的setup_environ()一次性django脚本?【英文标题】:Alternativetothedeprecatedsetup_environ()forone-offdjangoscripts?【发布时间】:2013-02-0912:48:39【问题描述】:不久前我使用setup_environ()编写了一个一次性的python脚本,该脚本可以从... 查看详情

替代已弃用的 setup_environ() 一次性 django 脚本?

】替代已弃用的setup_environ()一次性django脚本?【英文标题】:Alternativetothedeprecatedsetup_environ()forone-offdjangoscripts?【发布时间】:2013-02-0912:48:39【问题描述】:不久前我使用setup_environ()编写了一个一次性的python脚本,该脚本可以从... 查看详情

OAuth2FeignRequestInterceptor 的替代方案,依赖于已弃用的类

】OAuth2FeignRequestInterceptor的替代方案,依赖于已弃用的类【英文标题】:AlternativeforOAuth2FeignRequestInterceptorthatdependsonadeprecatedclass【发布时间】:2020-05-0511:07:44【问题描述】:免责声明:老实说,我尝试在google/github上搜索,扫描了... 查看详情

macOS 10.8 (Mountain Lion) 之后已弃用的资源 'CurResfile'、'UseResFile' 等的替代 API

】macOS10.8(MountainLion)之后已弃用的资源\\\'CurResfile\\\'、\\\'UseResFile\\\'等的替代API【英文标题】:AlternativeAPIsforresources\'CurResfile\',\'UseResFile\',etc.whichhavebeendeprecatedaftermacOS10.8(MountainLion)macOS10.8(MountainLion)之后 查看详情