私はこの質問が以前に尋ねられたことを知っていますが、私はそれを機能させることができません。助けてください。外部ストレージのアクセス許可を追加しましたが、それでも読み取り専用なのはなぜですか?
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
FileOutputStream fos = new FileOutputStream("tours");
これは、読み取りまたは書き込みが可能な場所を指しているわけではありません。 常にメソッドを使用して、読み取りと書き込みが可能な基本位置に到達します。
内部ストレージ への書き込みを検討している場合は、次のように変更します。
FileOutputStream fos = new FileOutputStream(new File(getFilesDir(), "tours"));
外部ストレージ への書き込みを検討している場合は、次のように変更します。
FileOutputStream fos = new FileOutputStream(new File(getExternalFilesDir(null), "tours"));
1)ここで、Path
はファイルを保存するディレクトリパスであり、FileName
は新しいファイルの名前です。
FileOutputStream fos = new FileOutputStream(new File(PATH+"/"+FileName));