1. 程式人生 > >Unity 3D 讀取android 本地相簿開啟相機

Unity 3D 讀取android 本地相簿開啟相機

最近由於工作需要,研究了關於Unity 呼叫本地呼叫手機相簿的的功能!在這裡我呢呀看了一下momo大神的工程!在工程的基礎上進行了改進。momo的工程師在點選手機返回鍵的時候才能將選擇的圖片顯示在unity 的場景當中!改進之後,就是說直接可以在選中圖片之後,就會直接顯示在面板當中,這樣就更加的符合一個工程的需要。當我們開啟相簿沒有選中圖片的時候,然後返回,同樣也不會開啟android 的activity,同樣也會開啟unity 的場景,讀取指定檔案目錄下面的圖片!
首先新建一個android的工程,然後在unity 的安裝目錄下面找到classes的一個jar包(找不到查百度),然後匯入unity 中,eclipse 郵件 build path Add Ex..選擇jar包匯入。
這裡寫圖片描述


新建工程的時候包名稱記得和unity 的包名稱一樣。
然後新建一個webViewActivity 的類。
在主類裡面繼承UnityPlayerActivity

package com.xys;


import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.unity3d.player.UnityPlayerActivity;

public class UnityTestActivity extends UnityPlayerActivity {
//public class UnityTestActivity extends Activity { Context mContext = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext = this; } //Unity中會呼叫這個方法,用於區分開啟攝像機 開始本地相簿 public void TakePhoto(String str) { Intent intent = new
Intent(mContext,WebViewActivity.class); intent.putExtra("type", str); this.startActivity(intent); } }

然後是WebViewActivity

package com.xys;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.unity3d.player.UnityPlayer;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.KeyEvent;
import android.widget.ImageView;

public class WebViewActivity extends Activity
{


    ImageView imageView = null;  

    public static final int NONE = 0;  
    public static final int PHOTOHRAPH = 1;// 拍照  
    public static final int PHOTOZOOM = 2; // 縮放  
    public static final int PHOTORESOULT = 3;// 結果  

    public static final String IMAGE_UNSPECIFIED = "image/*";  


    public final static String FILE_NAME = "image.png";
    public final static String DATA_URL = "/data/data/";


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        setContentView(R.layout.main);


        imageView = (ImageView) this.findViewById(R.id.imageID);

        String type = this.getIntent().getStringExtra("type");

        //在這裡判斷是開啟本地相簿還是直接照相
        if(type.equals("takePhoto"))
        {
              Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
              intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg")));  
              startActivityForResult(intent, PHOTOHRAPH);  
        }else
        {
               Intent intent = new Intent(Intent.ACTION_PICK, null);  
               intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);  
               startActivityForResult(intent, PHOTOZOOM);  
        }




    }  

    @Override  
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
        if (resultCode == NONE)  
        {
            if(data==null)
            {
               this.finish();
               UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME);
            }else {
                if(this.isFinishing()==false)
                {
                 this.finish();
                }
                 UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME);
            }
            return;
        }
        // 拍照  
        if (requestCode == PHOTOHRAPH) {  
            //設定檔案儲存路徑這裡放在跟目錄下  
            File picture = new File(Environment.getExternalStorageDirectory() + "/temp.jpg");  
            startPhotoZoom(Uri.fromFile(picture));  
        }  

        if (data == null)  
        {
            this.finish();
             UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME);
        }


        // 讀取相簿縮放圖片  
        if (requestCode == PHOTOZOOM) {  
            startPhotoZoom(data.getData());  
        }  
        // 處理結果  
        if (requestCode == PHOTORESOULT) {  
            Bundle extras = data.getExtras();  
            if (extras != null) {  

                Bitmap photo = extras.getParcelable("data");  
                imageView.setImageBitmap(photo);  

                try {
                    SaveBitmap(photo);
                    this.finish();
                    UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }  

        }  

        super.onActivityResult(requestCode, resultCode, data);  
    }  

    public void startPhotoZoom(Uri uri) {  
        Intent intent = new Intent("com.android.camera.action.CROP");  
        intent.setDataAndType(uri, IMAGE_UNSPECIFIED);  
        intent.putExtra("crop", "false");  
        // aspectX aspectY 是寬高的比例  
        intent.putExtra("aspectX", 1);  
        intent.putExtra("aspectY", 1);  
        // outputX outputY 是裁剪圖片寬高  
        intent.putExtra("outputX", 300);  
        intent.putExtra("outputY", 300);  
        intent.putExtra("return-data", true);  
        startActivityForResult(intent, PHOTORESOULT);  
    }  


    public void SaveBitmap(Bitmap bitmap) throws IOException {

        FileOutputStream fOut = null;

        //註解1
        String path = "/mnt/sdcard/Android/data/com.xys/files";
        try {
              //檢視這個路徑是否存在,
              //如果並沒有這個路徑,
              //建立這個路徑
              File destDir = new File(path);
              if (!destDir.exists()) 
              {

                  destDir.mkdirs();

              }

            fOut = new FileOutputStream(path + "/" + FILE_NAME) ;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        //將Bitmap物件寫入本地路徑中,Unity在去相同的路徑來讀取這個檔案
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        try {
            fOut.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        if (keyCode == KeyEvent.KEYCODE_BACK ) 
        {

               //當用戶點選返回鍵是 通知Unity開始在"/mnt/sdcard/Android/data/com.xys/files";路徑中讀取圖片資源,並且現在在Unity中
               UnityPlayer.UnitySendMessage("Main Camera","messgae",FILE_NAME);
        }
        return super.onKeyDown(keyCode, event);
    }
}

在android的main,xml佈局檔案裡面放置一個Imageview
andrdoiManifest.xml檔案就不說了,有一點android基礎應該沒有問題。

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

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".UnityTestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

       <activity
            android:name=".WebViewActivity">
        </activity>
    </application>

    <!-- 連線網際網路的許可權 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SDCard中建立與刪除檔案許可權 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- SDCard寫入資料許可權 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
</manifest>

完成之後將eclipse 的工程打一個包,很多人不知道這塊怎麼打包,匯出來的包在unity 中不能釋出android的工程。首先clean一下工程,然後選中工程,右鍵,Export JAR file Next
這裡寫圖片描述之選中這兩個,然後選擇儲存路徑打包就好。
然後將包匯入Unity 工程中,如下圖、
這裡寫圖片描述
新建一個test.cs檔案,然後給攝像機。就ok了。
這裡寫圖片描述
下載地址關注我部落格

相關推薦

Unity 3D 讀取android 本地相簿開啟相機

最近由於工作需要,研究了關於Unity 呼叫本地呼叫手機相簿的的功能!在這裡我呢呀看了一下momo大神的工程!在工程的基礎上進行了改進。momo的工程師在點選手機返回鍵的時候才能將選擇的圖片顯示在unity 的場景當中!改進之後,就是說直接可以在選中圖片之後,就

Android中通過訪問本地相簿或者相機設定使用者頭像

目前幾乎所有的APP在使用者註冊時都會有設定頭像的需求,大致分為三種情況: (1)通過獲取本地相簿的圖片,經過裁剪後作為頭像。 (2)通過啟動手機相機,現拍圖片然後裁剪作為頭像。 (3)在APP中新增一些自帶的頭像資源,供使用者選擇(不夠人性化,目前很少使用)。 這次我們簡

Unity 3d憤怒的小鳥-Kinematic(開啟動力學)

在Rigidbody 2D–Body Type–Kinematic(開啟動力學)   Unity Rigidbody使用 之 isKinematic的使用。在Unity中,isKinematic結合Gravity使用,能使物體瞬間在有無動力效果中切換,本節介紹如何使用isKinematic實現憤

Android呼叫相簿相機(相容6.0、7.0、8.0)所需新增的許可權

在AndroidManifest.xml中新增: <!--讀寫記憶體塊許可權--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&

開啟相機讀取本地相簿實現

本文主要實現如何開啟相機把照的圖片展示,還有就是讀取本地相簿,把選取中的圖片返回。第一步:  許可權宣告,一個是相機許可權一個是讀取許可權 <uses-permission android:name="android.permission.CAMERA"/>

Unity 開啟Android手機相簿和攝像頭

需求:要實現開啟手機的相簿和攝像頭,選擇照片或者拍照後,在unity進行。   1.android外掛 我使用的是AndroidStuido來寫外掛,下面是一步步介紹流程 (1)建立android工程 注意紅框裡面的東西,要修改兩個地方:

開啟安卓手機相簿相機並裁剪圖片上傳到unity

1、建立一個空的安卓工程 2、在unity安裝目錄下找到classes.jar檔案並匯入到工程中的libs資料夾下(classes.jar目錄為:unity安裝目錄\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Devel

Android開發之呼叫相機拍照與本地相簿選擇圖片

使用者看到的介面如下,也是我的xml介面: demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖: 點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖: 這時候你可以直接點選確定,也可

Android拍照和從相簿獲取圖片(解決android7.0開啟相機崩潰的問題),同時也解決了拍完照後圖片方向不正的問題

再android7.0中相機操作需要動態申請許可權,在點選開啟相機按鈕時要先判斷許可權,沒有許可權要申請,有許可權再操作,同時在申請許可權的回撥方法中也要判斷是否有許可權,有許可權的話再呼叫開啟相機的方法 package test.img.com.myim

史上最強Android 開啟照相或者是從本地相簿選中一張圖片以後先裁剪在儲存並顯示的講解附原始碼i

整個程式的佈局很簡單 只在一個垂直方向上的線性佈局裡面有倆個按鈕(Button)和一個顯示圖片的控制元件(ImageView) 這裡就不給出這部分的程式碼了 1.是開啟系統的相簿 Intent albumIntent = new Intent(Intent.ACTION

android 開啟本地相簿選擇圖片並返回顯示

1 package com.jerry.crop; 2 3 import java.io.File; 4 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.gra

Android 呼叫系統相機拍照 . 選取本地相簿

專案中,基本都有使用者自定義頭像或自定義背景的功能,實現方法一般都是呼叫系統相機–拍照,或者系統相簿–選擇照片,然後進行剪裁,最終設為頭像或背景。 我直接貼上使用的程式碼吧! 這次偷懶了,沒有做效果圖,不過這是我試過的程式碼,可以,只不過不能選取原圖,因為

Android中使用Intent開啟本地相簿

 1. //開啟系統相簿 Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore

Unity讀取Android SDcard文件

tro 如果 studio length == man 兩種 設置 長度 一、添加權限 權限添加 :Player settings -- Other settings -- write permission的設置 Sdcard。這個是在Unity編輯器裏打包的情況。 如

Android的WebView呼叫本地相簿

首先要知道android本身的WebView是並不支援呼叫手機檔案並上傳的,其次WebView的核心在android每次更新的時候都是不太一樣的,也是夠坑爹的;不過需求又不能改,H5需要呼叫系統相簿,還好最後還是找到方法解決了,就是要重寫裡面的一個方法,不過這種情況也是在5.0之前有效,5.

Unity Android 下載安裝開啟apk

基本思路:用www下載伺服器上的apk儲存於persistentPath,然後呼叫android方法安裝apk完成更新。 1.下載apk IEnumerator InstallApk() { WWW www = new WWW(url); //下載需要更新的apk

實現開啟Android系統相簿、照相機並實現照相,錄影功能。

通過本篇部落格,你將學到以下知識點:  1.學會如何開啟Android系統中相簿的圖片,視訊,並使用這些圖片,視訊。  2.學會如何打Android開照相機進行照相,錄影,並使用這樣圖片和視訊。  下面我將展示兩種方法來實現這些需求,注意:以下程式碼要用真機測試才行。&

安卓開發呼叫相機本地相簿選擇照片並上傳(上傳retrofit實現)

private File tempFile = new File(Environment.getExternalStorageDirectory(), getPhotoFileName()); // 使用系統當前日期加以調整作為照片的名稱 private String ge

Android學習之呼叫相機相簿

呼叫攝像頭拍照 修改佈局檔案中程式碼: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"

Unity呼叫Android方法實現開啟第三方APK

Android 建立的Android的工程,和平常一樣建立 匯入classes.jar包開啟Windows找到classes.jar檔案複製到app> libs下。我的classes.jar檔案位置為D:\ Unity5.6.0 \ Editor \ Data