web-dev-qa-db-ja.com

Android Studioのオープンに失敗しました:ファイルの作成時にEROFS(読み取り専用ファイルシステム)

私はこの質問が以前に尋ねられたことを知っていますが、私はそれを機能させることができません。助けてください。外部ストレージのアクセス許可を追加しましたが、それでも読み取り専用なのはなぜですか?

public class MainActivity extends Activity {

    public static final String LOGTAG="EXPLORECA";
    public static final String USERNAME="pref_username";
    public static final String VIEWIMAGE="pref_viewimages";

    private SharedPreferences settings;

    private OnSharedPreferenceChangeListener listener;
    private File file;
    private static  final String FILENAME = "jasondata";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        settings = PreferenceManager.getDefaultSharedPreferences(this);

        listener = new OnSharedPreferenceChangeListener() {

            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                                                  String key) {
                MainActivity.this.refreshDisplay(null);
            }
        };
        settings.registerOnSharedPreferenceChangeListener(listener);

        File extDir = getExternalFilesDir(null);
        String path = extDir.getAbsolutePath();
        UIHelper.displayText(this, R.id.textView, path);

        file = new File(extDir,FILENAME);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    public void setPreference(View v) {
        Log.i(LOGTAG, "Clicked set");
        Intent intent = new Intent(this, UIHelper.class);
        startActivity(intent);
    }

    public void refreshDisplay(View v) {
        Log.i(LOGTAG, "Clicked show");

        String prefValue = settings.getString(USERNAME, "Not found");
        UIHelper.displayText(this, R.id.textView, prefValue);

    }

    public void createFile(View v) throws IOException, JSONException {

        if(!checkExternalStorage())
        {
            return;
        }

        JSONArray data = getNewJSONData();

        String text = data.toString();

        try{
            FileOutputStream fos = new FileOutputStream("tours");
            fos.write(text.getBytes());
            fos.close();

            UIHelper.displayText(this, R.id.textView, "File written to disk:\n" + data.toString());
        }
        catch (IOException e) {
            e.printStackTrace();
            UIHelper.displayText(this, R.id.textView, e.toString());
        }

    }

    public void readFile(View v) throws IOException, JSONException {

        FileInputStream fis = new FileInputStream("tours");
        BufferedInputStream bis = new BufferedInputStream(fis);
        StringBuffer b = new StringBuffer();
        while (bis.available() != 0) {
            char c = (char) bis.read();
            b.append(c);
        }
        bis.close();
        fis.close();

        JSONArray data = new JSONArray(b.toString());

        StringBuffer toursBuffer = new StringBuffer();
        for (int i = 0; i < data.length(); i++) {
            String tour = data.getJSONObject(i).getString("tours");
            toursBuffer.append(tour + "\n");
        }

        UIHelper.displayText(this, R.id.textView, toursBuffer.toString());
    }

    private JSONArray getNewJSONData() throws JSONException {
        JSONArray data = new JSONArray();
        JSONObject tour;

        tour = new JSONObject();
        tour.put("tour", "Salton Sea");
        tour.put("price", 900);
        data.put(tour);

        tour = new JSONObject();
        tour.put("tour", "Death Valley");
        tour.put("price", 600);
        data.put(tour);

        tour = new JSONObject();
        tour.put("tour", "San Francisco");
        tour.put("price", 1200);
        data.put(tour);
        return data;
    }

    public boolean checkExternalStorage()
    {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED))
        {
            return true;
        }
        else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))
        {
            UIHelper.displayText(this, R.id.textView,"read-only");
        }
        else
        {
            UIHelper.displayText(this, R.id.textView,"unavailable");
        }
        return false;
    }

メインアクティビティXML

<EditText
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:id="@+id/editText"
    Android:layout_alignParentTop="true"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentStart="true"
    Android:layout_alignParentRight="true"
    Android:layout_alignParentEnd="true" />

<Button
    style="?android:attr/buttonStyleSmall"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="Create File"
    Android:id="@+id/createFile"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentStart="true"
    Android:layout_marginBottom="92dp"
    Android:onClick="createFile"/>

<Button
    style="?android:attr/buttonStyleSmall"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:text="Read File"
    Android:id="@+id/readFile"
    Android:layout_alignTop="@+id/createFile"
    Android:layout_centerHorizontal="true"
    Android:onClick="readFile"/>

<TextView
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:textAppearance="?android:attr/textAppearanceLarge"
    Android:text="Command"
    Android:textSize="10sp"
    Android:id="@+id/textView"
    Android:layout_alignParentBottom="true"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentStart="true"
    Android:layout_below="@+id/readFile"
    Android:layout_alignRight="@+id/editText"
    Android:layout_alignEnd="@+id/editText" />

UIHelper Javaクラスパッケージclaudiu.externalstorage;

import Android.app.Activity;
import Android.widget.CheckBox;
import Android.widget.EditText;
import Android.widget.TextView;

public class UIHelper {

    public static void displayText(Activity activity, int id, String text) {
        TextView tv = (TextView) activity.findViewById(id);
        tv.setText(text);
    }

    public static String getText(Activity activity, int id) {
        EditText et = (EditText) activity.findViewById(id);
        return et.getText().toString();
    }

    public static boolean getCBChecked(Activity activity, int id) {
        CheckBox cb = (CheckBox) activity.findViewById(id);
        return cb.isChecked();
    }

    public static void setCBChecked(Activity activity, int id, boolean value) {
        CheckBox cb = (CheckBox) activity.findViewById(id);
        cb.setChecked(value);
    }

マニフェスト

    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

    <application

        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Logcatトレース

 9318-9318/? W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.Java:409)
   9318-9318/? W/System.err﹕ Java.io.FileNotFoundException: /tours: open failed: EROFS (Read-only file system)
   9318-9318/? W/System.err﹕ at Java.io.FileOutputStream.<init>(FileOutputStream.Java:88)
   9318-9318/? W/System.err﹕ at Java.io.FileOutputStream.<init>(FileOutputStream.Java:128)
   9318-9318/? W/System.err﹕ at Java.io.FileOutputStream.<init>(FileOutputStream.Java:117)
   9318-9318/? W/System.err﹕ at claudiu.externalstorage.MainActivity.createFile(MainActivity.Java:93)
   9318-9318/? W/System.err﹕ at Java.lang.reflect.Method.invokeNative(Native Method)
   9318-9318/? W/System.err﹕ at Java.lang.reflect.Method.invoke(Method.Java:515)
   9318-9318/? W/System.err﹕ at Android.view.View$1.onClick(View.Java:3991)
   9318-9318/? W/System.err﹕ at Android.view.View.performClick(View.Java:4748)
   9318-9318/? W/System.err﹕ at Android.view.View$PerformClick.run(View.Java:19535)
   9318-9318/? W/System.err﹕ at Android.os.Handler.handleCallback(Handler.Java:733)
   9318-9318/? W/System.err﹕ at Android.os.Handler.dispatchMessage(Handler.Java:95)
   9318-9318/? W/System.err﹕ at Android.os.Looper.loop(Looper.Java:146)
   9318-9318/? W/System.err﹕ at Android.app.ActivityThread.main(ActivityThread.Java:5679)
   9318-9318/? W/System.err﹕ at Java.lang.reflect.Method.invokeNative(Native Method)
   9318-9318/? W/System.err﹕ at Java.lang.reflect.Method.invoke(Method.Java:515)
   9318-9318/? W/System.err﹕ at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1291)
   9318-9318/? W/System.err﹕ at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1107)
   9318-9318/? W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
   9318-9318/? W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: EROFS (Read-only file system)
   9318-9318/? W/System.err﹕ at libcore.io.Posix.open(Native Method)
   9318-9318/? W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.Java:110)
   9318-9318/? W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.Java:393)
   9318-9318/? W/System.err﹕ ... 18 more
7
Claudiu Haidu
FileOutputStream fos = new FileOutputStream("tours");

これは、読み取りまたは書き込みが可能な場所を指しているわけではありません。 常にメソッドを使用して、読み取りと書き込みが可能な基本位置に到達します。

内部ストレージ への書き込みを検討している場合は、次のように変更します。

FileOutputStream fos = new FileOutputStream(new File(getFilesDir(), "tours"));

外部ストレージ への書き込みを検討している場合は、次のように変更します。

FileOutputStream fos = new FileOutputStream(new File(getExternalFilesDir(null), "tours"));
20
CommonsWare

1)ここで、Pathはファイルを保存するディレクトリパスであり、FileNameは新しいファイルの名前です。

FileOutputStream fos = new FileOutputStream(new File(PATH+"/"+FileName));
0
Niazi Khan