2016-12-14 5 views
0

解析する必要があるxmlファイルを使用しようとしていますが、パス上のエミュレータ(APIレベル24)に手動でこのファイルを手動でコピーすると使用できます: /mnt/sdcardリソースからアンドロイドのxmlファイルを使用する方法

私のアプリケーションの.apkにこのファイルが必要です。私はこのファイルが最終的に.apkに含まれていることを理解しているので、私のプロジェクトの/ resフォルダから使用しようとしています。

これは私がsdcardから、今このファイルを使用している方法です:

public static File xml = new File("/mnt/sdcard/metro.xml"); 
public static Parser parser = new Parser(); 
public static Metro miMetro = parser.parsearMetro(xml); 

しかし、私はそれがアプリケーション内になりたいので、私は、このファイルの場所を変更したいと思います。

私がしようとした場合:

public static File xml = new File("/res/xml/metro.xml"); 

アプリケーションは、このファイルを見つけることができないと言います。

これはアプリの権限は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" /> 

誰かが私は私の方法を変更せずに、最終的な.apkに、このファイルをインクルードし、各デバイスに私のxmlファイルをコピーせずに、内部的に使用することができます方法を知っていますか?

だから今、私の活動は、次のようになります。

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(); 
      } 

     } 
    } 

} 

そして、私は、コンソールからこのエラーを取得する: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

答えて

0

あなたはassetsフォルダを使用し、そこにそれを置くことができます。 `; `パブリック静的メトロmiMetro = parser.parsearMetro(XML):File私は `InputStream`オブジェクトを受け取り、私は私の方法でFileオブジェクトを使用していたものと、この

InputStream is = getResources().getAssets().open("yourFile.xml"); 
+0

のようにそれを使用するアクセスするには また、私は静的参照を使用できません。これらの行が他のクラスで作成するこのMetroオブジェクトを使用したいと思います。 –

+0

@MiguelMGこの場合、sdcardのパスに新しい 'File'を作成する必要があります。 [これのような何か](0120-1820142/how-to-pass-a-file-path-which-is-in-assets-folder-to-filestring-path) –

+0

これは'.apk'に入るつもりはない? –

関連する問題