Unity3d は Android フォンのフォト アルバムを読み取ります

開発環境:

Android スタジオ 3.5.2

Unity3d 2020.3.25f1c1

目次

Android Studio セクション

1. 新規プロジェクトの作成 

2. 新しいモジュールを作成し、test という名前を付けます

3. デフォルトで作成された冗長な Moudle アプリを削除します

4. Unity3d の classes.jar をインポートする

5. Unity3d の UnityPlayerActivity.java をインポートする

6. MainActivity を作成する

7. Java コード部分

8. AndroidMainFest の設定

9. Android ビルド aar

10.Unity3dをインポート

Unity3d コード部分

最終表示

完全なプロジェクト ソース コード

拡大


Android Studio セクション

1. 新規プロジェクトの作成 

新しいプロジェクトの作成、空のアクティビティ、パッケージ com.example.unity2photo

2. 新しいモジュールを作成し、test という名前を付けます

[プロジェクト]、[新規 - モジュール]、[Android ライブラリ] に切り替えて、[次へ] をクリックします。

3. デフォルトで作成された冗長な Moudle アプリを削除します

モジュール設定を開き、APP ポイント - 番号を選択し、[はい]、[削除] の順に選択します。

4. Unity3d の classes.jar をインポートする

Unity3d インストール パスの下の対応する場所:

D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes

class.jar をコピーして libs ディレクトリの下に貼り付け、classer.jar を右クリック - ライブラリとして追加

5. Unity3d の UnityPlayerActivity.java をインポートする

D:\Software\Unity\2020.3.25f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player

 UnityPlayerActivity.java をコピーして、src - main- java - com.example.test の下に貼り付けます。

6. MainActivity を作成する

com.example.test を右クリックし、New –Activity – Empty Activity を選択します。

7. Java コード部分

package com.example.test;

import android.Manifest;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;


import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.unity_player.UnityPlayerActivity;


public class MainActivity extends  UnityPlayerActivity{

    //    @Override
//    protected void onCreate(Bundle savedInstanceState) {
//        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
//    }
//    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 获取存储权限,不然的话无法获取图片
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
        }
    }
    // unity点击按钮触发这个方法
    public void startPhoto() {
        Log.d("unity","打开相册");
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, 111);  // 第二个参数是请求码
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case 111:  // 请求码
                    Log.d("Unity", "相册返回");
                    UnityPlayer.UnitySendMessage("Main Camera", "message", parseUri(data));
                    Log.d("unity", parseUri(data));
                    break;
            }
        }
    }

    public String parseUri(Intent data) {
        Uri uri = data.getData();
        String imagePath;
        // 第二个参数是想要获取的数据
        Cursor cursor = getContentResolver()
                .query(uri, new String[]{MediaStore.Images.ImageColumns.DATA},
                        null, null, null);
        if (cursor == null) {
            imagePath = uri.getPath();
        } else {
            cursor.moveToFirst();
            // 获取数据所在的列下标
            int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
            imagePath = cursor.getString(index);  // 获取指定列的数据
            cursor.close();
        }

        return imagePath;  // 返回图片地址
    }
}

8. AndroidMainFest の設定

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <application>
        <activity android:name="com.example.test.MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="unityplayer.UnityActivity"  android:value="true" />
        </activity>
    </application>

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
</manifest>

9. Android ビルド aar

10.Unity3dをインポート

test_debug.arr をパッケージ化してビルドし、classes.jar を解凍して libs classes.jar を置き換え、test_debug.arr に圧縮します。

プラグイン - Android - AndroidMainfest.xml

プラグイン - Android - test_debug.arr

Unity3d コード部分

写真を読む2つの方法

1,UnityWebRequestTexture

2. ファイル ストリームを使用して画像を読み取る

    void CallAndroid()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("startPhoto");
        Debug.Log("点击按钮");
    }

    public void message(string str)
    {
        ShowImage(str);
        Debug.Log("安卓传来信息:" + str);
        //StartCoroutine(LoadTexturePreview("file://" + str));
    }

    //使用UnityWebRequestTexture读取图片
    IEnumerator LoadTexturePreview(string path)
    {
        UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(path);
        yield return uwr.SendWebRequest();
        Debug.Log("图片地址:" + path);
        if (uwr.isNetworkError || uwr.isHttpError)
        {
            Debug.Log("错误" + uwr.error);
        }
        else
        {

            Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
            // 图片显示在按钮上
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f));
            ImageView.sprite = sprite;
        }
    }


    //使用文件流读取图片
    private void ShowImage(string path)
    {
        FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
        fileStream.Seek(0, SeekOrigin.Begin);
        byte[] bye = new byte[fileStream.Length];
        fileStream.Read(bye, 0, (int)bye.Length);
        fileStream.Close();
        fileStream.Dispose();
        fileStream = null;

        Texture2D texture = new Texture2D(100, 50);
        texture.LoadImage(bye);
        Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
        ImageView.sprite = sprite;
    }

最終表示

完全なプロジェクト ソース コード

Unity3d は、携帯電話のアルバムの完全なプロジェクト例を開きます-Unity3D ドキュメント リソース-CSDN ダウンロード

含む: Unity3d は携帯電話のフォト アルバムを読み取り、unity は携帯電話のカメラを開き、写真を保存します。

拡大

APK のパッケージ化エラー

解決:

 

build.gralde のクラスパスは、Android Studio の gradle プラグイン バージョンを参照します。
「com.android.tools.build:gradle:3.5.2」

そして、gradle-wrapper.properties の distributionUrl は、指定された gradle バージョンです!

distributionUrl = https \: //services.gradle.org/distributions/gradle-5.4.1-all.zip

Gradle はオープン ソースの自動ビルド ツールであり、Gradle プラグインは Android Studio で Gradle を使用するために Google が開発したプラグインです。

参考URL:

Unity と Android 間の単純なやり取り、Unity が Android フォト アルバムを開いて呼び出す (Unity2019 以降)

Unity Gradle ビルド

Android Studio でエラーが報告されました: Error:Could not find com.android.tools.build:gradle:4.1 メモリ不足で穴を覚える_LittleFogCat のブログ - CSDN ブログ

Unity Gradle ビルド - ブリーフブック

Intent.ACTION_PICK

Intent.ACTION_PICK - 時はちょうどいい - Blog Garden

Unity 自動パッケージング - Android Studio - build.gradle の詳細解説

Unity自動パッケージング - Android Studio - build.gradle 詳細解説 - プログラマー募集

おすすめ

転載: blog.csdn.net/m1234567q/article/details/124864866