2011-12-12 39 views
49

我需要知道資產文件夾中的文件路徑字符串,因爲我使用的地圖API,它需要接收路徑字符串,和我的地圖必須存儲在資產文件夾如何獲取Android Path字符串到Assets文件夾中的文件?

這是代碼我試圖:因爲地圖沒有被加載

MapView mapView = new MapView(this); 
    mapView.setClickable(true); 
    mapView.setBuiltInZoomControls(true); 
    mapView.setMapFile("file:///android_asset/m1.map"); 
    setContentView(mapView); 

事情錯了與"file:///android_asset/m1.map"

至極是正確的路徑字符串的文件存儲在我的資產文件夾中的文件m1.map?

感謝

編輯Dimitru:此代碼不工作,它與is.read(buffer); IOException異常

 try { 
      InputStream is = getAssets().open("m1.map"); 
      int size = is.available(); 
      byte[] buffer = new byte[size]; 
      is.read(buffer); 
      is.close(); 
      text = new String(buffer); 
     } catch (IOException e) {throw new RuntimeException(e);} 

回答

74

AFAIK資產目錄中的文件不會被解壓縮。 相反,它們是從APK(ZIP)文件直接讀取的。

所以,你真的不能做的東西,期望文件接受資產'文件'。

相反,你必須提取的資產,並將其寫入到一個單獨的文件,像杜米特魯提示:

File f = new File(getCacheDir()+"/m1.map"); 
    if (!f.exists()) try { 

    InputStream is = getAssets().open("m1.map"); 
    int size = is.available(); 
    byte[] buffer = new byte[size]; 
    is.read(buffer); 
    is.close(); 


    FileOutputStream fos = new FileOutputStream(f); 
    fos.write(buffer); 
    fos.close(); 
    } catch (Exception e) { throw new RuntimeException(e); } 

    mapView.setMapFile(f.getPath()); 
+2

我收到異常:java.io.FileNotFoundException:m1.map – NullPointerException

+0

異常就行InputStream is = getAssets ()。開( 「m1.map」); – NullPointerException

+1

OK,解決了,但現在我得到了同樣的異常與杜米特魯答案,12-12 15:06:41.452:DEBUG /資產(3760):數據超過UNCOMPRESS_DATA_MAX(3491923 VS 1048576)每默認 – NullPointerException

8

失敗有從附帶的SDK API樣品看看ReadAsset.java。

 try { 
     InputStream is = getAssets().open("read_asset.txt"); 

     // We guarantee that the available method returns the total 
     // size of the asset... of course, this does mean that a single 
     // asset can't be more than 2 gigs. 
     int size = is.available(); 

     // Read the entire asset into a local byte buffer. 
     byte[] buffer = new byte[size]; 
     is.read(buffer); 
     is.close(); 

     // Convert the buffer into a string. 
     String text = new String(buffer); 

     // Finally stick the string into the text view. 
     TextView tv = (TextView)findViewById(R.id.text); 
     tv.setText(text); 
    } catch (IOException e) { 
     // Should never happen! 
     throw new RuntimeException(e); 
    } 
+0

它不適用於我,行is.read(緩衝區);給我IOException異常 – NullPointerException

+0

我編輯我的問題與新的代碼,檢查它請 – NullPointerException

+0

究竟是什麼拋出異常? –

5

您可以使用此方法。

public static File getRobotCacheFile(Context context) throws IOException { 
     File cacheFile = new File(context.getCacheDir(), "robot.png"); 
     try { 
      InputStream inputStream = context.getAssets().open("robot.png"); 
      try { 
       FileOutputStream outputStream = new FileOutputStream(cacheFile); 
       try { 
        byte[] buf = new byte[1024]; 
        int len; 
        while ((len = inputStream.read(buf)) > 0) { 
         outputStream.write(buf, 0, len); 
        } 
       } finally { 
        outputStream.close(); 
       } 
      } finally { 
       inputStream.close(); 
      } 
     } catch (IOException e) { 
      throw new IOException("Could not open robot png", e); 
     } 
     return cacheFile; 
    } 

你應該從來沒有在這樣的情況下使用InputStream.available()。它只返回緩衝的字節。使用.available()方法永遠不能處理更大的文件,並且根本無法在某些設備上工作。

1

我想補充的亞採的完美解決方案。如果你想在Kotlin中做到這一點,它不會立即工作。相反,你會想用這個:

@Throws(IOException::class) 
fun getSplashVideo(context: Context): File { 
    val cacheFile = File(context.cacheDir, "splash_video") 
    try { 
     val inputStream = context.assets.open("splash_video") 
     val outputStream = FileOutputStream(cacheFile) 
     try { 
      inputStream.copyTo(outputStream) 
     } finally { 
      inputStream.close() 
      outputStream.close() 
     } 
    } catch (e: IOException) { 
     throw IOException("Could not open splash_video", e) 
    } 
    return cacheFile 
} 
相關問題