web-dev-qa-db-ja.com

Android-アセットから/ data / dataフォルダーにファイルをコピーします

アプリでいくつかのファイルを使用する必要があります。それらはアセットフォルダーに保存されます。ファイルがアセットフォルダーから内部ストレージの/ data/data /にコピーされて使用されるSOについての議論を見ました。コードを取得しましたが、取得できないのは、アセットを内部ストレージにコピーする必要性は何ですか?誰かがこれで経験があれば、助けてください!

11
superuser

ちょうど私のためにポップアップした1つの理由は、ファイルへのパスを必要とし、そのコードを変更したくないNDKで既存のC/C++コードを使用する場合です。

たとえば、いくつかのデータファイルを必要とする既存のCライブラリを使用していますが、既存のインターフェイスは「load(char * path)」関数のみです。

おそらくもっと良い方法があるかもしれませんが、私はまだ見つけていません。

8
Markus Toman

これを試してください:(3つの方法すべてを使用して、「toPath」文字列オブジェクトで宛先パスを割り当てます)

  String toPath = "/data/data/" + getPackageName();  // Your application path


   private static boolean copyAssetFolder(AssetManager assetManager,
            String fromAssetPath, String toPath) {
        try {
            String[] files = assetManager.list(fromAssetPath);
            new File(toPath).mkdirs();
            boolean res = true;
            for (String file : files)
                if (file.contains("."))
                    res &= copyAsset(assetManager, 
                            fromAssetPath + "/" + file,
                            toPath + "/" + file);
                else 
                    res &= copyAssetFolder(assetManager, 
                            fromAssetPath + "/" + file,
                            toPath + "/" + file);
            return res;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    private static boolean copyAsset(AssetManager assetManager,
            String fromAssetPath, String toPath) {
        InputStream in = null;
        OutputStream out = null;
        try {
          in = assetManager.open(fromAssetPath);
          new File(toPath).createNewFile();
          out = new FileOutputStream(toPath);
          copyFile(in, out);
          in.close();
          in = null;
          out.flush();
          out.close();
          out = null;
          return true;
        } catch(Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    private static void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while((read = in.read(buffer)) != -1){
          out.write(buffer, 0, read);
        }
    }
5

実行時またはアプリケーションのインストール後にアセットフォルダーのデータを編集/変更することはできないと思います。したがって、ファイルを内部フォルダーに移動してから作業を開始します。

0
Rakki s