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

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

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

```java:MainActivity.java
　　System.getProperty("user.dir");
```
　　※返ってきた値は / のみ

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

```java: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](https://qiita-image-store.s3.amazonaws.com/0/17904/9ce1a574-1863-f543-1acc-1f677f5215be.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/

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

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

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

```java: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のプラグインとして使用する時

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

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