我在YouTube上看到了一个视频,了解如何在外部存储中存储数据。我做了视频中的人所说的但改变了一些东西(比如变量和文件名)。当我在模拟器或手机上执行应用程序时,如果try循环中的代码不可用(捕获异常),它会给我出现的错误。
package com.example.gabriel.apppapa2;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.util.Log;
import android.view.Menu;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Calendar;
import static android.R.attr.id;
public class MainActivity extends AppCompatActivity {
int y, m, a, d, r, g,dmes;
double idr, dida, dda;
MenuItem nuevo;
Button añadir, btnsi, btnno;
View ll;
View rl,rlconfirm;
TextView txtproyecto;
ArrayList<String> NomProyectos;
Button nproyecto;
EditText nproyecto_nombre;
ArrayAdapter<String> adapter;
ListView listview;
int posicion;
SharedPreferences sharpref;
SharedPreferences.Editor editor;
String s;
int e = 0;
boolean sdDisponible = false;
boolean sdAccesoEscritura = false;
BufferedReader fin;
OutputStreamWriter fout;
int idproyecto = 0;
private static String FICHERO = Environment.getExternalStorageDirectory() + "/proyectos.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll = findViewById(R.id.lnlayout);
rl = findViewById(R.id.rlayout);
nuevo = (MenuItem) findViewById(R.id.mas);
txtproyecto = (TextView) findViewById(R.id.prtxt);
nproyecto = (Button) findViewById(R.id.nproyecto);
btnsi = (Button) findViewById(R.id.si);
btnno = (Button) findViewById(R.id.no);
rlconfirm = findViewById(R.id.rlayoutconfirmar);
listview = (ListView) findViewById(R.id.listview);
***String estado = Environment.getExternalStorageState();
if (estado.equals(Environment.MEDIA_MOUNTED)){
sdDisponible = true;
sdAccesoEscritura = true;
} else if (estado.equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
sdDisponible = true;
sdAccesoEscritura = false;
} else {
sdDisponible = false;
sdAccesoEscritura = false;
}
if (sdAccesoEscritura && sdDisponible) {
try {
File ruta_sd = Environment.getExternalStorageDirectory();
File archivo = new File(ruta_sd.getAbsolutePath() + "/Proyectos/", "archivo_proyectos.txt");
fout = new OutputStreamWriter(new FileOutputStream(archivo));
fout.close();
}catch (Exception ex){
Log.e("Ficheros", "Error al escribir el fichero desde tarjeta SD");
}
}
if (sdDisponible){
try {
File ruta_sd = Environment.getExternalStorageDirectory();
File archivo = new File(ruta_sd.getAbsolutePath() + "/Proyectos/", "archivo_proyectos.txt");
fin = new BufferedReader(new InputStreamReader(new FileInputStream(archivo)));
String linea = fin.readLine();
txtproyecto.setText(linea);
fin.close();
}
catch (Exception ex){
Log.e("Ficheros", "Error al leer fichero desde tarjeta SD");
}
}***
final Calendar calendar = Calendar.getInstance();
y = calendar.get(Calendar.YEAR);
m = calendar.get(Calendar.MONTH)+1;
d = calendar.get(Calendar.DAY_OF_MONTH);
final Context context = this;
cdiasmes();
calcularColor();
NomProyectos = new ArrayList<>();
if (NomProyectos.size() == 0) {
txtproyecto.setText(R.string.nop);
txtproyecto.setTextSize(30);
} else {
txtproyecto.setText(R.string.sip);
}
adapter = new ArrayAdapter<>(this, R.layout.list_view, NomProyectos);
listview.setAdapter(adapter);
nproyecto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rl.setVisibility(View.VISIBLE);
ll.setVisibility(View.INVISIBLE);
listview.setVisibility(View.INVISIBLE);
}
});
posicion = listview.getCount();
sharpref = getPreferences(context.MODE_PRIVATE);
editor = sharpref.edit();
añadir = (Button) findViewById(R.id.añadir);
nproyecto_nombre = (EditText) findViewById(R.id.nuevo_proyecto_nombre);
añadir.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
idproyecto = idproyecto + 1;
editor.putString("String " + nproyecto_nombre.getText().toString(), nproyecto_nombre.getText().toString());
editor.apply();
String nuevoItem = sharpref.getString("String " + nproyecto_nombre.getText().toString(),"No has escrito nada");
NomProyectos.add(nuevoItem);
adapter.notifyDataSetChanged();
ll.setVisibility(View.VISIBLE);
rl.setVisibility(View.INVISIBLE);
listview.setVisibility(View.VISIBLE);
txtproyecto.setText(R.string.sip);
s = nproyecto_nombre.getText().toString();
if(idproyecto > 0) {
e = 1;
}
try {
fout.write(nproyecto_nombre.getText().toString());
}catch (Exception e){
Log.e("Ficheros","Error al guardar el proyecto en la tarjeta SD");
}
}
});
if(idproyecto > 0) {
listview.getChildAt(idproyecto).setId(idproyecto);
listview.getChildAt(posicion).setBackgroundColor(Color.rgb(r, g, a));
}
if (e == 1) {
listview.getChildAt(posicion).setBackgroundColor(Color.rgb(r, g, a));
listview.getChildAt(posicion).setId(Integer.parseInt(s));
}
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listview.getChildAt(position).setBackgroundColor(Color.rgb(r,g,a));
listview.getChildAt(position).toString();
SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
String Valor = sharedPref.getString(("String " + id), "sin dato");
}
});
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
rlconfirm.setVisibility(View.VISIBLE);
rl.setVisibility(View.INVISIBLE);
ll.setVisibility(View.INVISIBLE);
btnsi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rlconfirm.setVisibility(View.INVISIBLE);
ll.setVisibility(View.VISIBLE);
String borrar_item = adapter.getItem(position);
adapter.remove(borrar_item);
if(NomProyectos.isEmpty()){
txtproyecto.setText(R.string.nop);
}
}
});
return true;
}
});
btnno.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rlconfirm.setVisibility(View.INVISIBLE);
ll.setVisibility(View.VISIBLE);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.mas:
rl.setVisibility(View.VISIBLE);
ll.setVisibility(View.INVISIBLE);
return true;
case R.id.casa:
rl.setVisibility(View.INVISIBLE);
ll.setVisibility(View.VISIBLE);
rlconfirm.setVisibility(View.INVISIBLE);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void cdiasmes(){
if(m == 1||m == 3||m == 5||m == 7||m == 8||m == 10||m == 12){
dmes = 31;
}
else if (m == 4||m == 6||m == 9||m == 11){
dmes = 30;
}
else {
dmes = 28;
}
}
public void calcularColor(){
idr = y/15.0;
dida = idr - ((int)idr);
dda = dida*255.0;
a = (int)Math.round(dda);
g = (int)Math.round(m*255.0/12.0);
r = (int)Math.round(d*255.0/dmes);
}
}
Android Manifest: 我已经添加了权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.gabriel.apppapa2">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/icono_proyectos"
android:label="@string/app_name"
android:roundIcon="@mipmap/icono_proyectos"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
答案 0 :(得分:0)
你得到了哪个错误?您需要向Manifest.xml添加权限
写
0.02154559722626566
0.0215455972263
阅读
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
其他解决方案(如果您使用此解决方案,则无需任何许可)
另一个好的解决方案是使用Application目录而不是SD卡。 所以,你需要使用
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
而不是
getApplicationContext().getFilesDir().getPath()