android - “gomobile build”如何创建文件和写入文件(安装在三星平板电脑上的外部 micro-SD 卡)(在 APK 中)?
问题描述
原始问题:
有谁知道gomobile构建(非绑定)如何支持文件系统?如本讨论所述,我能够使用资产包打开和读取文件。
但不确定如何在 gomobile 生成的 APK 文件中创建对新文件的写入,我可以在 Go 中运行以下充足的代码并验证是否使用提供的消息创建了“testFile.txt”。
message := []byte("Hello, testing!")
err := ioutil.WriteFile("testFile.txt", message, 0777)
if err != nil {
fmt.Println(err)
}
但是在生成 APK 文件并在平板电脑(Android)上运行后,我得到如下文件访问错误,并且没有创建“testFile.txt”。
I/GoLog:打开 testFile.txt:只读文件系统
任何提示表示赞赏。
根据此说明更新了我的问题:
你使用的是什么版本的 Go('go 版本')?
$ go version
go version go1.16.3 windows/amd64
这个问题会在最新版本中重现吗?
不适用
您使用的是什么操作系统和处理器架构('go env')?
视窗 10 专业版
go env Output
$ go env
set GO111MODULE=auto
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\instu\AppData\Local\go-build
set GOENV=C:\Users\instu\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\instu\OneDrive\Desktop\go-workSpace\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\instu\OneDrive\Desktop\go-workSpace
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Projects\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Projects\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.16.3
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Users\instu\OneDrive\Desktop\go-workSpace\src\Minicloud\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\instu\AppData\Local\Temp\go-build2510967962=/tmp/go-build -gno-record-gcc-switches
你做了什么?
在原始问题部分进行了描述,但总而言之,我需要添加一个能够将日志写入三星 S6 lite 平板电脑上已安装的微型 SD 卡的功能。这是我在 Go 中编写文件时遵循的示例代码。它在我运行 go 时有效,但在平板电脑上生成和安装 APK 文件后我遇到只读错误消息
你期待看到什么?
期望 Android 应用程序(安装为 gomobile 构建生成的 APK 文件)能够创建文件并写入创建的文件
你看到了什么?
只读错误信息。
I/GoLog:打开 testFile.txt:只读文件系统
解决方案
此示例代码适用于我(写入内部存储):
func storeLog(fileDir string, fileName string, msg string) {
msgByte := []byte(msg)
file, err := os.Create(fileDir + fileName)
if err != nil
fmt.Printf(err)
defer file.Close()
numB, err := file.Write(msgByte)
if err != nil
fmt.Printf(err)
enter code here
fmt.Printf("wrote %d bytes\n", numB)
}
只需要确保:
- 找到合适的fileDir:
adb -s <deviceID> shell echo $EXTERNAL_STORAGE
- 使用以下命令查找您的 deviceID
亚行设备
- 在 AndroidManifest.xml 文件中添加用户写入文件的权限
推荐阅读
- android - 在 onCreate 中获取保存的片段实例时,尝试在空对象引用上调用虚拟方法“int java.util.ArrayList.size()”
- python - Kivy 内容大小调整
- linux - 打印可用内存和总内存的 Linux 基本脚本
- php - else 语句不适用于以下 php 代码
- .net - 获取 .NET core API 的所有授权端点
- python - 如何查看大图实时拼接?
- javascript - 对数组中的值使用 let 和 const 时出现 Linter 错误
- python - 使用 Python matplotlib 在图形上编写额外的符号(标题)
- json - Jsonpath 语法提取具有特定子键的特定父键
- python - Keras Word2Vec 实现