外部存储Android工作室,我做错了什么?

时间:2017-04-19 13:22:22

标签: android android-studio try-catch external android-external-storage

MainActivity:

我在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>

1 个答案:

答案 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()