2010-05-18 8 views
46

In J2ME, ich habe tun dies wie folgt aus: getClass().getResourceAsStream("/raw_resources.dat");Android Wie bekomme ich Zugriff auf Roh-Ressourcen, die ich in res-Ordner einlege?

Aber in android, ich auf diese immer null bekommen, warum?

+17

Es gibt einen großen Unterschied zwischen der Programmierung für androi d und J2ME – Janusz

+3

Es ist lustig, einen solchen Kommentar zu einer Frage über etwas zu lesen, das auf Android und J2ME identisch funktioniert. Siehe meine Antwort. – 0xF

Antwort

25
InputStream raw = context.getAssets().open("filename.ext"); 

Reader is = new BufferedReader(new InputStreamReader(raw, "UTF8")); 
+18

Bitte sehen Sie die Antwort von Samuh (unten), es ist genauer. – BoD

+1

Als Randnotiz erlaubt Raw-Ordner keinen Zugriff durch den Dateinamen. Einige Anwendungen benötigen dynamische Dateinamen, in solchen Fällen ist der Ordner "assets" nützlich – Caner

+8

er fragte nicht nach Assets/er fragte nach res/raw/ –

111

Für Raw-Dateien sollten Sie in Erwägung ziehen, einen Raw-Ordner im Res-Verzeichnis zu erstellen und dann getResources().openRawResource(resourceName) von Ihrer Aktivität aus aufzurufen.

+0

Samuh, danke für deine Antwort, wenn ich das mache, habe ich Fehler Android XML Format Problem, weil ich nicht Standard-XML verwende, gibt es andere Möglichkeit, es als wirklich Rohdaten zu verwenden? – Arkaha

+0

was meinst du mit nicht-standard XML? Sie können XML-Dateien auch in Assets bündeln. – Samuh

+0

Samuh, ich portiere j2me Anwendung, und es hat Dateien mit der Erweiterung * .xml, Inhalt solcher Dateien sehr ähnlich zu XML, aber nicht das gleiche, Eklipse schreiend auf diese Dateien, weil es nicht kompilieren kann. wahrscheinlich kann ich eine Art "ignorieren" auf diese Dateien setzen? aber ich weiß nicht, wie .. – Arkaha

3
TextView txtvw = (TextView)findViewById(R.id.TextView01); 
     txtvw.setText(readTxt()); 

private String readTxt() 
    { 
    InputStream raw = getResources().openRawResource(R.raw.hello); 

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    int i; 
    try 
    { 
     i = raw.read(); 
     while (i != -1) 
     { 
      byteArrayOutputStream.write(i); 
      i = raw.read(); 
     } 
     raw.close(); 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 

     e.printStackTrace(); 
    } 


    return byteArrayOutputStream.toString(); 

} 

TextView01 :: txtview in Linearlayout hallo :: .txt-Datei in res/raw Ordner (u ny othr Ordner als wel zugreifen können)

Ist 2 Linien 2 in onCreate geschrieben() Methode

Rest ist in der Klasse zu schreiben Verlängerung Aktivität!

12

In einigen Situationen müssen wir Bild von ziehbar oder roh Ordner erhalten unter Verwendung von Bildnamen statt, wenn erzeugt id

// Image View Object 
     mIv = (ImageView) findViewById(R.id.xidIma); 
// create context Object for to Fetch image from resourse 
Context mContext=getApplicationContext(); 

// getResources().getIdentifier("image_name","res_folder_name", package_name); 

// find out below example 
    int i = mContext.getResources().getIdentifier("ic_launcher","raw", mContext.getPackageName()); 

// now we will get contsant id for that image  
     mIv.setBackgroundResource(i); 
+4

Diese Zeile: int i = mContext.getResources(). GetIdentifier (" ic_launcher "," roh ", mContext.getPackageName()); ist GOLD – Radu

2

Input in = GetResources() openRawResource (resource).

Dies funktioniert ordnungsgemäß. Zuvor müssen Sie die XML-Datei/Textdatei in der Roh-Ressource erstellen. Dann wird es zugänglich sein.

Bearbeiten
Manchmal wird com.andriod.R importiert, wenn ein Fehler in Layoutdatei oder Bildnamen vorliegt. Damit Sie das Paket korrekt importieren müssen, ist nur die Raw-Datei verfügbar.

+1

openRawResource() benötigen ein int, keine Zeichenfolge http://developer.android.com/reference/android/content/res/Resources.html#openRawResource() – mmathieum

+0

wird dies auch auf Ressourcen, die in der existieren Zeichnungsordner? –

+1

Verwenden Sie "R.raw.NameOfResource" als int. – CristianCV

3

getClass().getResourcesAsStream() funktioniert gut auf Android. Stellen Sie nur sicher, dass die Datei, die Sie öffnen möchten, korrekt in Ihrem APK eingebettet ist (öffnen Sie das APK als ZIP).

Normalerweise unter Android setzen Sie solche Dateien in das Verzeichnis assets. Wenn Sie also die raw_resources.dat im assets Unterverzeichnis Ihres Projektes setzen, wird es in dem assets Verzeichnis in der APK am Ende und Sie können verwenden:

getClass().getResourcesAsStream("/assets/raw_resources.dat"); 

Es ist auch möglich, den Build-Prozess anpassen, so dass die Datei landet nicht im Verzeichnis assets im APK.

0

Ein Fortschritt Ansatz wird mit Erweiterungsfunktion

fun Context.getRawInput(@RawRes resourceId: Int): InputStream { 
    return resources.openRawResource(resourceId) 
} 

Eine weitere interessante Sache ist Erweiterungsfunktion Verwendung, die in Verschließbare Rahmen definiert ist

Zum Beispiel können Sie mit Eingabestrom in eleganter Art und Weise arbeiten kann, ohne Umgang mit Ausnahmen und Speichermanagement

fun Context.readRaw(@RawRes resourceId: Int): String { 
    return resources.openRawResource(resourceId).bufferedReader(Charsets.UTF_8).use { it.readText() } 
} 
Verwandte Themen