Ich versuche, eine XML-Datei zu verwenden, die ich analysieren muss, aber ich kann es nur verwenden, wenn ich manuell diese Datei in meinem Emulator (API Level 24) auf Pfad kopieren: /mnt/sdcard
Wie verwende ich eine XML-Datei in Android von Ressourcen
ich brauche diese Datei in .apk
meine App, so versuche ich es aus/res Ordner von meinem Projekt zu verwenden, weil ich verstehe, dass wird so diese Datei schließlich in .apk
enthält. Diese
ist, wie ich bin mit dieser Datei jetzt aus sdcard
:
public static File xml = new File("/mnt/sdcard/metro.xml");
public static Parser parser = new Parser();
public static Metro miMetro = parser.parsearMetro(xml);
Aber ich möchte die Position dieser Datei ändern, weil ich es in App sein wollen.
Wenn ich versuche:
public static File xml = new File("/res/xml/metro.xml");
App sagt, dass es diese Datei nicht finden kann. Diese
ist, wie App-Berechtigungen wie folgt aussehen in AndroidManifest.xml
:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Weiß jemand, wie kann ich diese Datei in die endgültige .apk
umfassen ohne meine Methoden zu ändern und es intern verwenden, ohne in jedem Gerät meine XML-Datei zu kopieren?
So, jetzt sieht meine Tätigkeit wie folgt aus:
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.miguel.metromadappcesible.code.Metro;
import com.miguel.metromadappcesible.code.Parser;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class IndexActivity extends AppCompatActivity {
public static Parser parser = new Parser();
public static Metro miMetro;
public IndexActivity() throws IOException {
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_index);
try {
this.crearFicheroXML(getAssets().open("metro.xml"));
} catch (IOException e) {
e.printStackTrace();
}
File xml = new File ("/mnt/sdcard/metroMadrid.xml");
miMetro = parser.parsearMetro(xml);
}
public void crearFicheroXML (InputStream inputStream){
OutputStream outputStream = null;
try {
// read this file into InputStream
inputStream = getResources().getAssets().open("metro.xml");
// write the inputStream to a FileOutputStream
outputStream =
new FileOutputStream(new File("/mnt/sdcard/metroMadrid.xml"));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
// outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Und ich bekomme diese Fehlermeldung von der Konsole: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
Damit erhalte ich ein 'InputStream' Objekt und ich bin mit einem File-Objekt in meiner Methode: ' public static Metro miMetro = parser.parsearMetro (xml); ' Und ich kann auch nicht statische Referenz verwenden, und ich möchte dieses Metro-Objekt verwenden, das diese Zeilen in anderen Klassen erstellen. –
@MiguelMG In diesem Fall müssen Sie eine neue Datei im SDCARD-Pfad erstellen, z. [so etwas] (http://stackoverflow.com/questions/11820142/how-to-pass-a-file-path-which-is-in-assets-folder-to-filestring-path) –
Aber das ist nicht in '.apk' sein wird nicht? –