2017-02-21 30 views
1
package component 

import (
    "encoding/json" 
    "io/ioutil" 
    "os" 
) 


type LastComponent struct { 
    Name string 
} 

const fname = "componentfiles" 


func Persist(comp string) string { 
    lcomp := LastComponent{Name: comp} 
    b, err := json.Marshal(lcomp) 
    if err != nil { 
     return "err-MARSHAL" 
    } 
    file, err := os.Create(fname) 
    if err != nil { 
     return "err-CREATE-FILE" 
    } 
    defer file.Close() 
    _, err = file.Write(b) 
    if err != nil { 
     return "err-FILE-WRITE-PROB" 
    } 
    return "" 
} 

func Component() string { 
    f, err := os.Open(fname) 
    if err != nil { 
     return "err-FILE-NOT-OPEN" 
    } 
    defer f.Close() 
    b, err := ioutil.ReadAll(f) 
    if err != nil { 
     return "" 
    } 
    var v LastComponent 
    json.Unmarshal(b, v) 
    return v.Name 
} 


} 

Код выше работает отлично, а также часть кода JavaScript. Я продолжаю получать err-CREATE-FILE внутри своего javascript. Таким образом, os.Create и os.Open не работают должным образом.os.Create и os.Open не работают с gomobile и отвечают на родной язык

Хотя это внутреннее хранилище, разрешения не требуются, но я также включил разрешения в файле манифеста, но безрезультатно.

Что может быть правильным способом для Open и Create файлов в андроид с помощью gomobile при использовании на стороне React Native?

Update:

В adb logcat, я получаю это повсюду

E/Vold ( 276): Failed to find mounted volume for /storage/sdcard1/Android/data/com.gotest/cache/

+0

Что такое ошибка от os.Create? Вы пытались сохранить абсолютный путь - что-то вроде «/ sdcard/myfile»? – Steve101

+0

Вы можете открыть файл в Java/ObjC/Swift? –

ответ

0

Таким образом, вы должны иметь некоторый успех, если вы передадите это в качестве параметра - что-то вроде следующее работает для меня:

go:

func Component(folderPath string) string { 
    f, err := os.Open(path.Join(folderPath, fname)) 
    ... 

Java:

Component.Component(getApplicationContext().getFilesDir().getAbsolutePath()) 

В качестве альтернативы, вы можете использовать что-то вроде getExternalStorageDirectory().getAbsolutePath(). Ключ их состоит в том, что вам нужно получить где-то хранилище, доступное для записи вашим процессом/пользователем.