problema al escribir fichero en SdCard

boqueron

Estoy intentando crear un fichero de texto donde guardar valores del acelerómetro del móvil, pero no consigo poder guardar el fichero en la tarjeta SdCard del móvil.

Adjunto códigos:
Aquí parte del manifiesto, donde he puesto los permisos de escritura en la memoria externa del móvil

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.proyectocadencia">
    <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
    <application

Creo que eso esta todo bien, el problema viene con la creación de un fichero de texto, escribir sobre el y luego guardarlo en la tarjeta externa del móvil:

Código de creación de la ruta y fichero donde guardar mis datos:

private void creaEscritor(){

    root = android.os.Environment.getExternalStorageDirectory();
   // root = android.os.Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
    tv.append("\nExternal file system root: "+root);


    dir = new File (root.getAbsolutePath() + "/Proyecto");
   // dir = new File ("/storage/extSdCard/Proyecto");
    if(!dir.exists()) {
        dir.mkdirs();
    }

    file = new File(dir, "ficheropruebas.txt");
}

Y aquí el código para escribir sobre el fichero de texto ya creado en el directorio seleccionado(se supone):

public void escribeFichero(float aceleracion){
    try {
        f = new FileOutputStream(file);
        pw = new PrintWriter(f);
        pw.println("Se ha detectado una modificacion del sensor en el timevent: " + ultima_medicion);
        pw.println("se ha detectado una diferencia de aceleracion lineal de " + aceleracion);
        pw.println("el numero de pedaladas es de " + pedaladas);
        pw.flush();
        pw.close();
        f.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Log.i(TAG, "******* Fichero no encontrado");
    } catch (IOException e) {
        e.printStackTrace();
    }
    tv.append("\n\nFile written to "+file);
}

Si alguien me puede echar una mano se lo agradecería, ya no se que hacer porque sin este archivo de texto para ver resultados no puedo seguir avanzando.

Gracias.

zoeshadow

Qué target SDK tienes en el manifest.xml?

En qué dispositivo/versión estás probando?

A partir del SDK 23 hay que pedir los permisos en runtime, ( esto solo afecta si tienes el target SDK a 23 ) http://developer.android.com/training/permissions/requesting.html

1 respuesta
boqueron

#2 No tengo puesto ningún target SDK en mi manifiest.xml. o eso creo. si quieres te copio todo el manifiest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.proyectocadencia">
    <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MedidorCadencia"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:theme="@style/FullscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".pantalla_muestreo"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/pantalla_muestreo"
        android:theme="@style/FullscreenTheme">

    </activity>
</application>
</manifest>
1 respuesta
zoeshadow

#3 me he confundido, el target se pone en el fichero build.gradle ( si has creado el proyecto con Android Studio tendrás dos de estos, revisa los dos )

1 respuesta
boqueron

#4 este es mi grandle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.example.diego.proyectocadencia"
    minSdkVersion 21
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
    compile 'com.android.support:support-v4:23.2.0'
}

boqueron

Bueno, acojonante, como lo tengo ahora me esta escribiendo en una carpeta Proyecto que me crea en el root del almacenamiento interno, así que por ahora me vale, pero no entiendo porque no lo genera en el root de la SDcard pero bueno.

Magia de la programación.

LLoid

A ver si es lo que yo creo que es.

 file = new File(dir, "ficheropruebas.txt");

crea una instancia de la clase File, pero eso no significa que te esté creando un fichero como tal en el almacenamiento externo. Con total probabilidad tendrás que llamar a algún método tipo create() o createFile() de la clase File.

1 respuesta
boqueron

#7 voy a probar a hacer file.createNewFile(); justo después de esa linea para que me cree el nuevo fichero, si es eso es para darme con una piedra en la cabeza agggg

1 respuesta
2 años después
varuk

#8 ¿Qué fue? ¿Lo conseguiste?

1 respuesta
boqueron

#9 No me acuerdo pero si que lo conseguí