ユニティAndroidのオープンアルバムやカメラ

出典:https://blog.csdn.net/qweewqpkn/article/details/84141614

 

要件:、携帯電話のカメラやフォトアルバムを開い達成団結で写真や画像を、選択します。

 

1.androidプラグイン
私が使用は、書き込みプラグインにAndroidStuidoあり、以下では、ステップ導入プロセスによってステップであります

(1)は、Androidのプロジェクトを作成します

 

 

 

 

二つの場所を変更するために、物事の内側赤いボックスに注意してください。

1. com.android.applicationはcom.android.library変更しました

削除2. APPLICATIONID "com.niko.myunityplugin"

 

 

これら2つのディレクトリを削除し、それらを必要としません

 

(2)は、そのパス内のjarパッケージの団結に頼るようにご参加ください。

C:\プログラムファイル\ Unity5.6.4p3 \エディタ\データ\ PlaybackEngines \ AndroidPlayer \変奏曲\モノ\リリース\クラス

 

下に示すように、それから彼は、私たちのアンドロイドプロジェクトの下libsディレクトリの下に置きます:

 

このときも、エンジニアリングは、我々がに持っているので、それは、あります知っています:

 

 

 

注:赤いボックスがコンパイル選択されているだけで、むしろ実装よりも、この選択の理由は、それが最終的に我々は実装がパックAARのうち、最後の休憩にjarファイルを置く場合AARファイルは、このjarパッケージは含まれませんアウトパックです我々は、手動で削除する必要があり、あるいは我々は、間違っているとAPK時間を戦うために、独自のパッケージと瓶の団結。

 

我々は彼らを必要としないものの以下の赤いボックスを削除しました:

 

 

この時点で、我々はあなたがインターフェイス内でそれを使用することができるので、プロジェクトに追加され、この瓶に成功し、その後、コードを書くようになったてきました

 

(3)書き込みプラグインコード

パッケージcom.niko.myunityplugin。
輸入android.app.Activity;
輸入android.content.Intent;
輸入android.graphics.Bitmap;
輸入android.graphics.BitmapFactory;
輸入android.net.Uri;
輸入android.os.Build;
輸入android.os.Bundle;
輸入android.os.Environment;
輸入android.provider.MediaStore;
輸入android.support.v4.content.FileProvider;
輸入android.util.Log;

輸入com.unity3d.player.UnityPlayer;
輸入com.unity3d.player.UnityPlayerActivity。

インポートのjava.io.File;
輸入java.io.FileNotFoundException。
輸入java.io.FileOutputStreamは、
インポートにjava.io.IOException;

輸入静的android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION。
輸入静的android.content.Intent.FLAG_GRANT_WRITE_URI_PERMISSION。

パブリッククラスMainActivityはUnityPlayerActivityを拡張{

プライベート静的最終int型TAKE_PHOTO = 1。
プライベート静的最終int型のOPEN_GALLERY = 2;
プライベート静的最終int型のCROP_PHOTO = 3;
プライベートウリmPhotoUri。
プライベートウリmCropPhotoUri。

@Overrideは、
ボイドのonCreate(バンドルsavedInstanceState)を保護
{
super.onCreate(savedInstanceState)。
}

公共ボイドTakePhoto(){
mPhotoUri =のgetURI(のCreateFile( "temp.png"));
テントの意図=新しいテント(MediaStore.ACTION_IMAGE_CAPTURE)。
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)。
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)。
intent.putExtra(MediaStore.EXTRA_OUTPUT、mPhotoUri)。
startActivityForResult(意図、TAKE_PHOTO)。

}

//调用相册
公共ボイドOpenGallery()
{
意図意図=新しいテント(Intent.ACTION_PICK、NULL);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI、 "画像/ *")。
startActivityForResult(意図、OPEN_GALLERY)。
}

プライベートウリのgetURI(ファイルファイル)
{
ウリURI。
IF(Build.VERSION.SDK_INT> = 24)
{
URI = FileProvider.getUriForFile(この、getPackageName()+ ".fileprovider"ファイル)。
}

{
URI = Uri.fromFile(ファイル)。
}

URIを返します。
}

プライベートファイルのCreateFile(文字列名)
{
ファイルファイル=新しいファイル(Environment.getExternalStorageDirectory()、名);
試す
{
IF(file.exists())
{
file.delete()。
}
file.createNewFile()。
}キャッチ(IOExceptionを電子)
{
e.printStackTrace();
}

ファイルを返します。
}

プライベートボイドStartCrop(URI inputUri)
{
mCropPhotoUri = Uri.fromFile(のCreateFile( "tempCrop.png"));

テントの意図=新しいテント( "com.android.camera.action.CROP");
intent.addFlags(FLAG_GRANT_READ_URI_PERMISSION)。
intent.addFlags(FLAG_GRANT_WRITE_URI_PERMISSION)。
intent.setDataAndType(inputUri、 "画像/ *")。
intent.putExtra( "クロップ"、 "真")。
// aspectX aspectY是宽高的比例
intent.putExtra( "aspectX"、1);
intent.putExtra( "aspectY"、1);
//出力x outputY是裁剪图片宽高
intent.putExtra( "出力x"、300);
intent.putExtra( "outputY"、300);
intent.putExtra( "スケール"、真の);
intent.putExtra( "リターン・データ"、偽の);
intent.putExtra( "noFaceDetection"、真の);
intent.putExtra(MediaStore.EXTRA_OUTPUT、mCropPhotoUri)。
startActivityForResult(意図、CROP_PHOTO)。
}

保護された無効onActivityResult(int型requestCode、

IF(resultCodeが== Activity.RESULT_CANCELED)
{
Log.d( "結束"、 "ユーザがオペレータをキャンセル!!")。
リターン;
}

スイッチ(requestCode)
{
ケースTAKE_PHOTO:
{
StartCrop(mPhotoUri)。
}
ブレーク;
ケースOPEN_GALLERY:
{
ウリURI = data.getData()。
StartCrop(URI)。
}
ブレーク;
ケースCROP_PHOTO:
{
試み
{
ビットマップビットマップ= BitmapFactory.decodeStream(getContentResolver()openInputStream(mCropPhotoUri)。)。
FileOutputStream FOUT = NULL;

トライ
{
文字列のパス=「/mnt/sdcard/Android/data/com.niko.myunityplugin/files」。
ファイルdestDirの新しいファイル(パス)=。
もし(!のdestDir.exists())
{
destDir.mkdirs();
}

FOUT =新しいたFileOutputStream(パス+ "/" + "image.png")。
}
キャッチ(にFileNotFoundException電子)
{
e.printStackTrace();
}

(ビットマップ= NULL!)なら
、{
bitmap.compress(Bitmap.CompressFormat.PNG、100、FOUT)。
{試みる
fOut.flush()。
}キャッチ(IOExceptionを電子){
e.printStackTrace();
}
{試みる
fOut.closeを();
}キャッチ(IOExceptionを電子){
e.printStackTrace();
}

UnityPlayer.UnitySendMessage( "UnityPlugin"、 "OnGetPhoto"、 "image.png")。
}
}
キャッチ(にFileNotFoundException E)
{
e.printStackTrace();
}
}
BREAK;
}
}
}
上記のコードを加えた後は、あなたが示すように、中にエラーがあることがわかります。

 

新しいjarファイルの参照を追加するには、以下に示すように、このクラスは、私たちはこの時間は、対応するjarファイルのパッケージにそれを導入するだろうという情報手段の欠如、そして次に我々オープンbuild.gradleファイル。

 

エンジニアリングを追加した後、私たちは、プロジェクトが示すように、jarファイルをダウンロードするには、リモートリポジトリからダウンパックを始めたように、同期ボタンをクリックします。

 

あなたがダウンロードしたら、我々はプロジェクトを与えられていないだろう

 

(4)変更AndroidManifest.xmlファイル

<?xml version = "1.0"コード= "UTF-8"?>
<マニフェストのxmlns:アンドロイド= "http://schemas.android.com/apk/res/android"
パッケージ= "com.niko.myunityplugin">

<アプリケーションは
allowBackup = "true"を:アンドロイド
アンドロイド:アイコン= "@ミップマップ/ ic_launcher"
アンドロイド:ラベル= "文字列@ / APP_NAME"
アンドロイド:roundIcon = "@ミップマップ/ ic_launcher_round"
アンドロイド:supportsRtl = "true"の
アンドロイド:テーマ= "@スタイル/ AppTheme">
<アクティビティは、Android:名前は= "MainActivity ">
<意図-フィルタ>
<アクションは、Android:名=" android.intent.action.MAIN" />

<カテゴリは、Android:名= "android.intentを.category.LAUNCHER」/>
</インテントフィルタ>
</活性は>

<プロバイダは、
アンドロイド:名= "android.support.v4.content.FileProvider"
アンドロイド:当局= "com.niko.myunityplugin.fileprovider"
アンドロイド:エクスポート= "false"の
アンドロイド:grantUriPermissions = "真">
<メタデータ
アンドロイド:名= "android.support.FILE_PROVIDER_PATHS"
アンドロイド:リソース= "XML @ / provider_paths」/>
</プロバイダ>
</アプリケーション>

< -连接互联网的权限- >!
<用途許可は、Android:名= "android.permission.INTERNETあなた" />
<! - SDカード写入数据权限- >
<用途許可アンドロイド:名= "android.permission.WRITE_EXTERNAL_STORAGE" />
</マニフェスト>
 

示されるように(5)は、XMLファイルを増やします。

 

provider_paths.xml内容は以下のとおりです。

<XMLバージョン= "1.0"エンコード= "UTF-8"?>
<パスのxmlns:アンドロイド= "http://schemas.android.com/apk/res/android">
<外部パス名= "external_files" 。「」パス= />
</パス>
コンパイル次の図に示すように、プロジェクトをコンパイルを開始するために幸せになることがあります。

 

物事の2個の赤い箱、団結にコピー内側に行く必要があります。ここでは、プラグインを記述する必要が完了すると、次の団結を呼ぶようになったがあります。

 

2.Unity呼び出しプラグイン
の設定(1)環境

ディレクトリに示すように、コンパイラはちょうど何かを置きます:

 

 

 

パッケージ名のAndroidのプラグインのパッケージ名はここに、私たちは同じに設定することができます。

 

(2)コードを書きます

システムを使用しました。
System.Collectionsを使用しました。
System.Collections.Genericを使用しました。
UnityEngineを使用しました。
UnityEngine.UIを使用しました。

パブリッククラスTestPlugin:MonoBehaviour
{
公共ボタンmBtnCamera。
公共ボタンmBtnGallery。
公共RawImage mImage。
公開テキストMTEXT。
プライベートアクション<バイト[]> mPhotoAction。

//を使用し、この初期化
ボイド開始()
{
mBtnCamera.onClick.AddListener(()=>
{
TakePhoto((DATAS)=>
{

});
});

mBtnGallery.onClick.AddListener(()=>
{
OpenGallery((DATAS)=>
{

});
});
}

公共のボイドTakePhoto(アクション<バイト[]>コールバック)
{
AndroidJavaClass JC =新AndroidJavaClass( "com.unity3d.player.UnityPlayer");
AndroidJavaObjectジョー= jc.GetStatic <AndroidJavaObject>( "[現在")。
jo.Call( "TakePhoto");
mPhotoAction =コールバック。
}

公共ボイドOpenGallery(アクション<バイト[]>コールバック)
{
AndroidJavaClass JC =新しいAndroidJavaClass( "com.unity3d.player.UnityPlayer")。
AndroidJavaObjectジョー= jc.GetStatic <AndroidJavaObject>( "[現在")。
jo.Call( "OpenGallery");
mPhotoAction =コールバック。
}

ボイドOnGetPhoto(文字列名)
{
StartCoroutine(LoadPhoto(名));



{
MText.text =名、
文字列のパス= "ファイル://" + Application.persistentDataPath + "/" +名;
WWW新しい新しいWWW = WWW(パス);
収率リターンWWW;
mImage.texture = www.texture;
IF( !mPhotoAction = NULL)
{
mPhotoAction(((にTexture2D)mImage.texture).EncodeToPNG());
mPhotoAction = NULL;
//破壊(テクスチャ);
}
}
}
次に、シーンのオブジェクト、および関連するボタンに連結されたスクリプト示すように、画像やテキスト、:

赤い線を注意:写真を撮った後、ここに団結で表示されるので、メッセージアンドロイドのためのオブジェクトコードの名前はUnityPluginあるので、我々はUnityPlguinを修正するためにここにいるので、私たちは、団結のメッセージを与えます。

 

 

その上でAPKを荷造りを始める、私はパッケージングプロセスエラーを持っていない私たちはAPKインストールと操作、おめでとうをプレイした後に続いて、ハハハッハッハ、フラッシュバックを実行します。エラー図:

 

 

私たちは情報android.support.v4.content.FileProviderこのクラスが不足している手段、えっ?私たちは、Androidプロジェクトにライブラリを追加しないで前にいますか?なぜ与えられている、私は、長い時間のためにピット前にこの質問を置くオンラインチェックし、Androidのエンジニアリングパッケージは、私たちの中にAPKのjarパッケージにパッケージ化されることはありませんので、そこが失われたことを言ったが、どのように我々彼は私のAPKにして、それを詰めて、これを取得するために、瓶のパッケージ?ここでは解決策は以下のとおりです。

 

私たちは、このカテゴリにカットするには、Ctrl +マウスの左ボタンを押したまま、間違ったクラスのパッケージを検索し、

 

その後、我々はあなたが示すように、それは、所属するパッケージを知ることができ、このタブ上にマウスを置きます:

 

私たちは、依存関係の下、リモートリポジトリからダウンロードするためのアンドロイドのスタジオである。図に示されている彼のパスは、このパスは、パッケージのソースであり、我々は、図示のように、我々はパスで見つけることができるのjarパッケージをコンパイルする必要があります。

 

 

 

 

[OK]を、よく私たちはそれをコピーする、jarファイルのパッケージを見つけ、に社名を変更:我々はアンドロイドプロジェクトディレクトリを置く前に示すように、支持コア-utilsの-26.1.0-sources.jar、LIBS:

 

 

プロジェクトは、このjarファイルの存在を知っている、そしてそれは、結果が示す前に、そのメソッドのjarパッケージを追加してみましょう:

 

 

我々はそれを再同期させる、重複を避けるために、依存パッケージの前にリモートリポジトリを削除しました。この時点では、ライブラリを再コンパイル

 

これであなたも、私たちはAPKを再パッケージ化することができ、このパッケージのlibsディレクトリAARの下のjarパッケージに依存する必要性を見ることができます。あなたはすべてのものをパックした後、あなたは写真を撮ることができます。

 

最後に、送信元アドレス:ソースは、私の友人を指し

注:このパッケージには、別のに使用されるソースコードの名前であり、そしてここで私は違うと説明し、ここでの復興プロジェクトの私の説明は、あなたのイラストを与えることです。
----------------
免責事項:この記事はCC 4.0 BY-SAの著作権契約書に従って、CSDNブロガー「monk_CDの元記事である、元のソースのリンクと、この文を添付してください、再現。 。
オリジナルリンクします。https://blog.csdn.net/qweewqpkn/article/details/84141614

 

 

おすすめ

転載: www.cnblogs.com/LiTZen/p/11899508.html