unity讀取StreamingAssets文本文件

因爲StreamingAssets目錄對於Android來說是在apk裏面的,所以File讀取不到裏面的內容信息,必須通過Android的api讀取加載。
C#代碼

//=====================================================
// - FileName:      ProviderService 
// - Description:
// - Author:        wangguoqing
// - Email:         [email protected]
// - Created:       2017/12/13 17:12:17
// - CLR version:   4.0.30319.42000
// - UserName:      Wang
// -  (C) Copyright 2008 - 2015, hehehuyu,Inc.
// -  All Rights Reserved.
//======================================================

using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
/// <summary>
/// 和平臺層交互必須通過unity主線程調用
/// </summary>
public class ProviderService :MonoBehaviour {
    public static ProviderService Instance;

#if UNITY_ANDROID
    private AndroidJavaClass jc;
    private AndroidJavaObject jo;
#endif
    void Awake()
    {
        Instance = this;
    }
    void Start()
    {
#if UNITY_ANDROID &&!UNITY_EDITOR
        jc = new AndroidJavaClass("com.test.game.AppActivity");
        jo = jc.CallStatic<AndroidJavaObject>("GetActivity");
#endif
    }


    /// <summary>
    /// 讀取StreamingAsset 下的文件
    /// 必須在unity主線程調用,否則JNI調用不過去
    /// </summary>
    /// <returns></returns>
    public byte[] ReadBytes(string fileName)
    {
        byte[] data = null;
        #if UNITY_ANDROID &&!UNITY_EDITOR
            data = jo.Call<byte[]>("ReadBytes", fileName);
        #endif
            return data;
    }
}

Android代碼

package com.test.game;

import com.unity3d.player.UnityPlayerActivity;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import com.unity3d.player.UnityPlayer;

import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Bundle;
import android.os.Environment;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.ImageView;
import android.widget.Toast;


public class AppActivity extends UnityPlayerActivity {
    
    public static final String GameObjectName="Service";
    public static final String ApplinkMethodName="BroadcastApplinkUrl";
    public static final String BatteryChangedMethodName="BroadcastBatteryChanged";
    public static final String AppPackName = "com.hehegames.majiangone";
    
    public static AppActivity activity=null;
    TelephonyManager phoneManager=null;
    WifiManager wifiManager=null;
    WifiInfo wifiInfo = null;       //獲得的Wifi信息 
    @Override
      protected void onCreate(Bundle savedInstanceState)
      {
        Log.v("life","onCreate");  
          super.onCreate(savedInstanceState);
          activity=this;
          //顯示splash
          ShowSplash();
          phoneManager = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
           // 獲得WifiManager  
            wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
            assetManager = getAssets();
           //applink 
          Uri uri = getIntent().getData();
          if(uri!=null)
          {
              ApplinkUrl=uri.toString();
          }
          else
          {
              ApplinkUrl=null;
          }
          
      }
    public static AppActivity GetActivity()
    {
        
        return activity;
    }
    
    //********************************read StreamingAsset file*************************************************
    protected AssetManager assetManager;
    private byte[] ReadBytesByStream(InputStream inputStream) 
    {
 
      ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//長度這裏暫時先寫成1024
      byte buf[] = new byte [2048];
 
      int len;
 
      try {
 
       while ((len = inputStream.read(buf)) != -1) {
 
        outputStream.write(buf, 0, len);
 
       }
 
       outputStream.close();
 
       inputStream.close();
 
      } catch (IOException e) {
          return null;
      }
      return outputStream.toByteArray();
    }    

    
    //load StreamingAsset file by byte array
    public byte[] ReadBytes(String path)
    {
    
         InputStream inputStream = null ;
         
          try {
 
               inputStream = assetManager.open(path);
 
              } catch (IOException e) {
 
               Log.v ("unity", "ReadBytes:::"+e.getMessage());
               return null;
              }
 
          return ReadBytesByStream(inputStream);
    }    
} 

這裏注意下AppActivity 的方法ReadBytes必須在unity主線程調用,否則調用失敗,unity沒有日誌,這裏被坑了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章