LoginSignup
7
7

More than 5 years have passed since last update.

AndroidでアセットバンドルのZip解凍までの道のり

Last updated at Posted at 2015-03-31

フォルダ構成がさっぱりわからなかった。

 ●カレントディレクトリのパスを取得する

MainActivity.java
  System.getProperty("user.dir");

  ※返ってきた値は / のみ

 ●カレントディレクトリのファイル一覧を取得する

MainActivity.java
    File[] files;
    String sdPath = System.getProperty("user.dir");
    files = new File(sdPath).listFiles();

 ●返ってきたファイル一覧

[0] = {java.io.File@3741}"/sdcard"
[1] = {java.io.File@3742}"/storage"
[2] = {java.io.File@3743}"/config"
[3] = {java.io.File@3744}"/cache"
[4] = {java.io.File@3745}"/acct"
[5] = {java.io.File@3746}"/vendor"
[6] = {java.io.File@3747}"/d"
[7] = {java.io.File@3748}"/etc"
[8] = {java.io.File@3749}"/mnt"
[9] = {java.io.File@3750}"/ueventd.rc"
[10] = {java.io.File@3751}"/ueventd.goldfish.rc"
[11] = {java.io.File@3752}"/system"
[12] = {java.io.File@3753}"/sys"
[13] = {java.io.File@3754}"/service_contexts"
[14] = {java.io.File@3755}"/sepolicy"
[15] = {java.io.File@3756}"/selinux_version"
[16] = {java.io.File@3757}"/seapp_contexts"
[17] = {java.io.File@3758}"/sbin"
[18] = {java.io.File@3759}"/property_contexts"
[19] = {java.io.File@3760}"/proc"
[20] = {java.io.File@3761}"/init.zygote32.rc"
[21] = {java.io.File@3762}"/init.usb.rc"
[22] = {java.io.File@3763}"/init.trace.rc"
[23] = {java.io.File@3764}"/init.rc"
[24] = {java.io.File@3765}"/init.goldfish.rc"
[25] = {java.io.File@3766}"/init.environ.rc"
[26] = {java.io.File@3767}"/init"
[27] = {java.io.File@3768}"/fstab.goldfish"
[28] = {java.io.File@3769}"/file_contexts"
[29] = {java.io.File@3770}"/default.prop"
[30] = {java.io.File@3771}"/data"
[31] = {java.io.File@3772}"/charger"
[32] = {java.io.File@3773}"/root"
[33] = {java.io.File@3774}"/dev"

 これはっ!Android Device Monitorで見たフォルダ構成ような

 ●Android Device Monitorの表示方法

  Android Studio上で [Tools]->[Android]->[Android Device Monitor]

 ●Android Device Monitor上のFile Explorer内のフォルダ構成

 AndroidのFileExplorer.png

●Androidでは書き込み可能フォルダがあるとの事(全然知らなかった)

 下記参考にしました。(すごく助かりました)
 http://kujirahand.com/blog/index.php?Androidでファイル出力に失敗する原因
 http://www.adamrocker.com/blog/196/android_file_io.html

 ・SDカード
 /sdcard/xxx
 ・データフォルダ
 /data/data/パッケージ名/xxx

 ・パッケージ名の取得方法
 this.getPackageName()

●AndroidでZipファイルの解凍・展開

 下記参考にしました。(すごく助かりました)
 http://dev.classmethod.jp/smartphone/android/android-tips-46-zipinputstream/
 http://techbooster.org/android/application/15261/

 ●呼び元(解凍するファイルパスを指定)

MainActivity.java
   extract("/data/myAssetBundle.zip");

 ●呼び先(ファイルパスを元にZipを展開する)

MainActivity.java
public void extract(String filename) 
{
    try {
        Toast.makeText(getBaseContext(), "Try Start", Toast.LENGTH_LONG).show();

        // Zipファイルを開く
        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(filename));
        ZipFile zipFile = new ZipFile(filename);
        // 順番に読み込む
        ZipEntry entry = null;
        while((entry = zipInputStream.getNextEntry()) != null) {
            // Listで表示するアイテム
            // データのコピー
            InputStream is = zipFile.getInputStream(entry);
            // データフォルダを書き込み先に指定
            String outputPath = "/data/data/" + this.getPackageName() + "/" + entry.getName();
            File outputFile = new File(outputPath);
            FileOutputStream os = new FileOutputStream(outputFile);
            byte[] buffer = new byte[1024];
            int length = 0;
            while ((length = is.read(buffer))>0) {
                os.write(buffer, 0, length);
            }
            os.close();
            is.close();
            zipInputStream.closeEntry();
        }
        zipInputStream.close();
        Toast.makeText(getBaseContext(), "Try End", Toast.LENGTH_LONG).show();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

●実際にUnityのプラグインとして使用する時

UnityPluginScript.cs
// プラグイン名をパッケージ名+クラス名で指定する。
AndroidJavaObject m_plugin = new AndroidJavaObject("com.test.miyaactivityzip.MiyaGetCachePath");
MiyaGetCachePath
package com.test.miyaactivityzip;

import android.app.Activity;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import android.util.Log;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class MiyaGetCachePath {


public void ZipRelease()
{
    ZipInputStream in = null;
    BufferedOutputStream out = null;

    ZipEntry zipEntry = null;
    int len = 0;

    try {
        final Activity activity = UnityPlayer.currentActivity;
        File inFile = new File(activity.getCacheDir().toString() + "/test.zip");
        in = new ZipInputStream(new FileInputStream(inFile));

        // test.zip が表示される
        Log.d("filename=", inFile.getName());

        // ZIPファイルに含まれるエントリに対して順にアクセス
        while ((zipEntry = in.getNextEntry()) != null) 
        {
            // Unity側で変更された名前ではなく 実際のzip名/中のファイル名 testtext/1.txt
            Log.d("zipEntry.getName=", zipEntry.getName());  

                File newfile = new File(zipEntry.getName());

                // Unity側で変更された名前ではなく 実際の中のファイル名 1.txt
            Log.d("newfile.getName=", newfile.getName());

            boolean isExists = newfile.exists();

            Log.d("isExists=", String.valueOf(isExists));
            // /data/data/com.test.miyaactivityzip/cache
            Log.d("getCacheDir=", activity.getCacheDir().toString());

            // 出力用ファイルストリームの生成
            out = new BufferedOutputStream(
                        new FileOutputStream(activity.getCacheDir().toString() + "/" + newfile.getName())
            );

            // エントリの内容を出力
            byte[] buffer = new byte[1024];
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }

            in.closeEntry();
            out.close();
            out = null;

        }
        in.close();
    } 
    catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
}
7
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7