- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个照片应用程序,可将图像从外部源流式传输到我在平板电脑 (Samsung Galaxy TAB S) 上的应用程序。我决定使用平板电脑的外置 SD 卡作为存储空间,因为内部存储空间经常用完。另外,我需要删除它以备份所有图像。
“读取”JPG 一切正常,但是当涉及到从流中“写入”JPG 到 SD 卡时,权限被拒绝。
我已经设置了WRITE_EXTERNAL_STORAGE
权限,但这不适用于 Android SDK 25.2.5,因为 Android 改变了外部访问权限的工作方式。
fWriteStorage:=JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
PermissionsService.RequestPermissions([fReadStorage, fWriteStorage], DisplayRationale);
我想要做的是调用 Android 系统文件夹选择器对话框以允许应用程序访问 SD 卡。如此处所述:SD Card on Android 5.0 and Later .
有谁知道如何在 Delphi 10.3 Rio 中调用 SD 卡的权限选择器?类似于所有应用程序,包括 TotalCommander for Android,需要对外部 SD 卡的写入权限。
我现在再次尝试,使用以下代码,但仍然没有成功。我需要为图库创建新文件夹,但无法创建文件夹。
fWriteStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
if PermissionsService.IsPermissionGranted(fWriteStorage) then
begin
applog('IsPermissionGranted: TRUE');
if ForceDirectories(System.IOUtils.TPath.Combine(GLOBAL_SDCARD, 'FoxyTab/Storage')) then
AppLog('GLOBAL_SDCARD Created')
else
AppLog('Can not create SD CARD folder ' + System.IOUtils.TPath.Combine(GLOBAL_SDCARD, 'FoxyTab/Storage'));
PermissionsService.RequestPermissions([fWriteStorage],
procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
begin
if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
begin
AppLog('Access Granted');
if ForceDirectories(System.IOUtils.TPath.Combine(GLOBAL_SDCARD, 'FoxyTab/Storage')) then
AppLog('GLOBAL_SDCARD Created')
else
AppLog('Can not create SD CARD folder ' + System.IOUtils.TPath.Combine(GLOBAL_SDCARD, 'FoxyTab/Storage'));
end
else
begin
AppLog('Access Denied');
end;
end);
我总是得到“已授予访问权限”,但无法创建文件夹。
SD 卡不是平板电脑内置的,而是“可移动”microSD 卡,因为当图库已满时我需要将其移除以备份到另一台设备 (PC/MAC)。卡的路径是/storage/2266-7298/。与使用标准目录返回的内容不同。
最佳答案
您无需调用系统对话框即可获得访问权限。
使用 PermissionsService.RequestPermissions()
时,您实际上需要等待 Android 回复授予或拒绝状态,然后您才能尝试执行您请求权限的操作。
在您显示的代码中,您没有将回调函数传递给 RequestPermissions()
以获取回复。因此,在您向 SD 卡写入文件之前,您不知道用户是否真的授予了访问权限。
你需要更多这样的东西:
fWriteStorage := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE);
...
if PermissionsService.IsPermissionGranted(fWriteStorage) then
begin
// access previously granted, write files...
end
else
begin
PermissionsService.RequestPermissions([fWriteStorage],
procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>)
begin
if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
begin
// access granted, write files...
end
else
begin
// access denied, can't write files...
end;
end,
DisplayRationale);
end;
end;
请注意,如果您使用 Android 的 Context.getExternalFilesDir()
函数(由 Delphi 的 System.IOUtils.TPath.GetSharedDocumentsPath()
方法包装),如果您正在写入属于您的应用程序包的文件夹,您实际上不需要 WRITE_EXTERNAL_STORAGE
权限来写入 SD 卡:
Starting in
Build.VERSION_CODES.KITKAT
, no permissions are required to read or write to the returned path; it's always accessible to the calling app. This only applies to paths generated for package name of the calling application. To access paths belonging to other packages,Manifest.permission.WRITE_EXTERNAL_STORAGE
and/orManifest.permission.READ_EXTERNAL_STORAGE
are required.
像 TotalCommander 这样的应用程序会访问其他应用程序的文件,这就是它需要 (READ|WRITE)_EXTERNAL_STORAGE
的原因。如果您的应用只是为了自己使用而读/写自己的文件,则可能不会。
关于android - 在 Delphi 10.3 Rio 中写入外部 SD 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599543/
我正在使用rdf4j库来导出XML文件。我使用org.eclipse.rdf4j.rio.RDFWriter将其保存到文件中,并且我需要定义基本名称空间。因此,我希望拥有这样的东西:。我知道我可以使用
我正在尝试在 RIO 应用程序中设置日志记录;但是,我似乎不了解日志记录界面。 RIO 文档鼓励定义记录器并按如下方式运行应用程序: withLogFunc logOptions $ \lf -> d
有人有如何在node-rio中使用sourceAndEval函数的示例吗? https://github.com/albertosantini/node-rio 我可以仅使用 eval 来运行基本示例
使用 rio.plot.show 后如何添加颜色条? 我尝试了很多东西,但遇到了各种错误 这是我尝试过的一种方法: fig, ax = plt.subplots(figsize = (16, 16))
RIO 在这里代表 Windows8 'Registered I/O'网络扩展。从示例代码来看,似乎无论您是将 RIONotify 与事件还是 IO 完成端口一起使用,您基本上最终都会编写相同的循环,
我已使用所需组件填充了表单,并将示例代码粘贴到了按钮单击事件中。 我已添加 TStringDynArrayarray 和 TSearchOption 类型声明,但出现编译错误,如下所示。 unit d
有没有办法在启动 IDE 时摆脱烦人的欢迎页面? 对于某些以前的版本,您可以通过注册表完成此操作,但我可以在 Rio 中找到它。尝试将文件夹“欢迎页面”重命名为其他名称,但随后出现错误 - 找不到页面
我对 Delphi 10.3 Rio 内联变量声明感到非常兴奋。但是我遇到了奇怪的问题,似乎我需要在内联声明后初始化记录: program Project8; {$APPTYPE CONSOLE} {
有没有办法在 iOS 中使用 MVVMCross 实现方法绑定(bind)?我在视频或教程中看不到此类绑定(bind)的示例... ImageNavigationViewModel: publ
我有一个曾经在 Delphi Seattle 创建的项目,现在我想搬到 Delphi Rio。我使用 findfirst/findnext 读取外部 SD 卡上的目录结构 i := findfir
我的代码: require 'rio' rio('nice.jpg') < rio('http://farm4.static.flickr.com/3134/3160515898_59354c9733
我正在使用 RIO monad 和 RIO 库,并且想添加日志记录。 RIO 日志函数,如 logInfo,将 Utf8Builder 作为参数,它是 ByteString 构建器的包装器。我想在我的
.NET 团队是否有任何计划让 Windows 8/Server 2012 中引入的 RIO 套接字在 .NET 中可用? 在 .NET 中使用它们的过渡期间我有哪些选择 - 扩展 Socket 类?
我正在尝试将 Servant 身份验证(servant-auth-server 包)与 RIO 作为我的处理程序 monad 结合使用,以避免出现 exceptT 反模式。但是,我无法正确排列类型以处
我有一个 HTTPRepository使用存储库的 URL 进行初始化。我使用 RepositoryConnection检索和添加(天气)数据到存储库。从 Web 服务中检索数据,然后将其转换为 RD
我有一个 ListView ,它绑定(bind)到一个字符串数组: 我的项目模板只是一个 TextView ... 再次使用瑞士... local:MvxBind="Text " /> 但
我正在尝试使用 GeoText 生成国家/地区提及,但无法识别像里约热内卢、里约热内卢这样的城市。我查了字典,里面那些城市都可以。 输入: text = "里约热内卢、拉斯维加斯、纽约" geo =
我正在尝试通过服务器端路由使用 Meteor 访问 Rserve 服务器来调用 R 代码。允许访问 Rserve 的 Node.js 模块是 node-rio我在 meteorhacks:npm 中使
我使用 RIOSend 通过分布式网络发送部分 TCP 数据。 Nagle 已关闭以达到最小延迟。 当目的地是本地时,一切看起来都不错,但如果是真正的远程(大约 40 毫秒 ping)目的地,我会看到
我在让 winsock RIO 工作时遇到了问题。似乎每次我发布 RIOReceive 时,它都会立即返回并传输 0 个字节,而我的对等方无法通过消息。 发布 RIOReceive 后,我等待 R
我是一名优秀的程序员,十分优秀!