android studio开发<十四> Unity3d调用安卓功能
2016-10-13 18:23
706 查看
原创
切记:调用这项安卓系统服务都要在AndroidManifest.xml里写入 获取权限。
以下例子的前提是已完成了Unity3d和AndroidStudio的交互,具体看上一篇博文。
一.调用震动
1.写入权限 <uses-permission android:name="android.permission.VIBRATE"/>
2. 写安卓代码
3.U3D写代码调用,调用方法看上一篇文章。
二.调用分享功能
直接写代码,能实现简单的分享功能,使用 shareSDK插件 能实现更丰富的功能。
shareSDK分享插件:http://www.mob.com
三.调用发送短信
如果只是发送其实2行就搞定了,我这里加了发送和接收是否成功的回执,代码有点多了。
1.写入权限
<!-- 发送消息-->
<uses-permission android:name="android.permission.SEND_SMS"/>
<!-- 阅读消息-->
<uses-permission android:name="android.permission.READ_SMS"/>
<!-- 写入消息-->
<uses-permission android:name="android.permission.WRITE_SMS" />
<!-- 接收消息 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
2. 写安卓代码
四.调用相册选择图片给U3D使用
思路:U3D调用安卓打开相机,选择图片裁剪后保存,保存好了通知U3D显示图片。
1.写入权限
<!-- SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2. 写安卓代码
3.Unity3d代码
前面几个例子没什么难的,就没有保留工程,最后一个U3D和AndroidStudio选相片图片交互的工程在下面地址下载:
Demo下载地址:http://download.csdn.net/detail/u012322710/9654072
APK安装包忘记传了:http://download.csdn.net/detail/u012322710/9654156
参考博客:http://blog.csdn.net/he_wen_jian/article/details/44040619
参考博客:http://www.xuanyusong.com/archives/1480
切记:调用这项安卓系统服务都要在AndroidManifest.xml里写入 获取权限。
以下例子的前提是已完成了Unity3d和AndroidStudio的交互,具体看上一篇博文。
一.调用震动
1.写入权限 <uses-permission android:name="android.permission.VIBRATE"/>
2. 写安卓代码
import com.unity3d.player.UnityPlayerActivity; import android.os.Vibrator; //导入震动包 import android.app.Service; //导入手机应用服务包 //继承自unity包的UnityPlayerActivity类 public class MainActivity extends UnityPlayerActivity { public Vibrator vibrator; //声明震动器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); 注释掉 不显示View } //给U3D调用的震动函数 public void ClickShake() { vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);//获取手机震动服务 //参数是2个一组,前一个表示延迟时间,后一个表示持续时间,立即开始,持续2秒,接着延迟5秒开始,持续1秒 //自定义震动模式,-1表示只震动一次,非-1则表示指定下标开始重复震动。并不是说3就是震动3次。 vibrator.vibrate(new long[]{0, 2000,5000 ,1000}, -1); //vibrator.hasVibrator() 是否有Vibrator // vibrator.cancel() 关闭震动 // vibrator.vibrate(5000) 震动5秒 } }
3.U3D写代码调用,调用方法看上一篇文章。
二.调用分享功能
直接写代码,能实现简单的分享功能,使用 shareSDK插件 能实现更丰富的功能。
shareSDK分享插件:http://www.mob.com
public void OnShare() { Intent shareInt = new Intent(Intent.ACTION_SEND); //新建发送Intent shareInt.setType("text/plain"); //纯文本 shareInt.putExtra(Intent.EXTRA_SUBJECT, "选择分享方式"); // 分享主题 shareInt.putExtra(Intent.EXTRA_TEXT, "快来下载这款游戏和我一起玩吧!"); // 分享的内容 shareInt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//应用没打开的话打开一个应用,打开了切换 shareInt = Intent.createChooser(shareInt, "分享啊!");//应用选择器,第二个参数是弹窗标题 startActivity(shareInt); }
三.调用发送短信
如果只是发送其实2行就搞定了,我这里加了发送和接收是否成功的回执,代码有点多了。
1.写入权限
<!-- 发送消息-->
<uses-permission android:name="android.permission.SEND_SMS"/>
<!-- 阅读消息-->
<uses-permission android:name="android.permission.READ_SMS"/>
<!-- 写入消息-->
<uses-permission android:name="android.permission.WRITE_SMS" />
<!-- 接收消息 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
2. 写安卓代码
import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.widget.Toast; import android.app.PendingIntent; //发送短信库 import android.telephony.SmsManager; //继承自unity包的UnityPlayerActivity类 public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); 注释掉 不显示View // 注册广播 发送消息 registerReceiver(sendMessage, new IntentFilter("SENT_SMS_ACTION")); registerReceiver(receiver, new IntentFilter("DELIVERED_SMS_ACTION")); } //发送广播 private BroadcastReceiver sendMessage = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //判断短信是否发送成功 switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(MainActivity.this, "短信发送失败", Toast.LENGTH_LONG).show(); break; } } }; //接收广播 private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //表示对方成功收到短信 Toast.makeText(MainActivity.this, "对方接收成功",Toast.LENGTH_LONG).show(); } }; //发送短信 //参数1:收信人手机号 2:发信人手机号 3:短信内容 4:发送是否成功的回执 5:接受是否成功的回执 public void SMSSend(String number, String content){ Intent sentIntent = new Intent("SENT_SMS_ACTION"); PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, 0); Intent deliverIntent = new Intent("DELIVERED_SMS_ACTION"); PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0, deliverIntent, 0); SmsManager sms = SmsManager.getDefault(); //获取短信管理器 sms.sendTextMessage(number, null, content, sentPI, deliverPI); //发送短信 }
四.调用相册选择图片给U3D使用
思路:U3D调用安卓打开相机,选择图片裁剪后保存,保存好了通知U3D显示图片。
1.写入权限
<!-- SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2. 写安卓代码
package com.zou.chongyang; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.widget.Toast; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; //发送短信库 //继承自unity包的UnityPlayerActivity类 public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); 注释掉 不显示View } //给U3D调用的打开相册 public void SelectPhoto() { //Intent就是应用之间,应用不同Activity之间交互。 Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); //新建Intent,让用户选择特定类型的数据,并返回该数据的URI. getAlbum.setType("image/*"); //类型为图片 startActivityForResult(getAlbum, 108); //调用相册,结果码108,如果有结果会返回108,这个值随便设置,只要>=0就行 } //重写Activity里的onActivityResult方法,这个方法和startActivityForResult是一对出现。 @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { // 用户没有进行有效的设置操作,返回系统固定的常量RESULT_CANCELED=0 if (resultCode == RESULT_CANCELED) { Toast.makeText(getApplication(), "没有选择图片", Toast.LENGTH_LONG).show(); return; } switch (requestCode) { case 108: Toast.makeText(getApplication(), "图片挑选完成", Toast.LENGTH_LONG).show(); //裁剪图片 CropPhoto(intent.getData());//获取资源的Uri,安卓Uri通用资源标识符,表示一个图片或视频 break; case 109: Toast.makeText(getApplication(), "图片裁剪完成", Toast.LENGTH_LONG).show(); //保存图片 //可能抛出异常方法IOException方法必须用Try try { SaveImage(intent); } catch (IOException e) { e.printStackTrace(); } break; } super.onActivityResult(requestCode, resultCode, intent); } //裁剪图片 public void CropPhoto(Uri uri) { //调用裁剪器 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 开启裁剪功能 intent.putExtra("crop", "true"); //设置宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); //裁剪图片宽高 intent.putExtra("outputX", 100); intent.putExtra("outputY", 100); //请求返回数据 intent.putExtra("return-data", true); startActivityForResult(intent, 109); //结果码109 } //保存裁剪图片供U3D读取 使用 FileOutputStream 必须要捕获和处理错误 抛出异常IOException private void SaveImage(Intent intent) throws IOException { //获取intent传过来的数据 //Bundle类是键值对形式,传递数据 Intent也可以传递数据,两个区别:intent是Bundle的封装 //Intent主要数据传递用,bundle主要存取数据用。 Bundle extras = intent.getExtras(); if (extras != null) { //取出数据 Bitmap bitmap = extras.getParcelable("data"); //文件路径=U3D里的Application.persistentDataPath路径 File destDir = new File("/mnt/sdcard/Android/data/com.zou.chongyang/files"); //如果没有这个目录,创建一个 if(!destDir.exists()) { destDir.mkdirs(); } //创建图片数据输出流 FileOutputStream bitmapOut = new FileOutputStream("/mnt/sdcard/Android/data/com.zou.chongyang/files/headImage.png"); //压缩图片 参数1:图片格式 参数2:压缩率100表示不压缩 参数3:写入输出流 bitmap.compress(Bitmap.CompressFormat.PNG, 100, bitmapOut); //讲输出流刷新写出到磁盘 bitmapOut.flush(); //关闭流 bitmapOut.close(); //通知U3D可以读取图片了 参数1:U3D物体名称 参数2:方法名 参数3:要传递的参数,这里传图片名称 UnityPlayer.UnitySendMessage("headImage","AndroidSaveHeadImageOver","headImage.png"); } } }
3.Unity3d代码
using UnityEngine; using System.Collections; using UnityEngine.UI; public class androidU3D : MonoBehaviour { //按钮事件 public void OnSelectPhoto() { AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //获取unity的Java类,只能调用静态方法,获取静态属性 AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); //获取当前的Activity对象,能调用公开方法和公开属性 //一开始就调用安卓选择图片 jo.Call("SelectPhoto"); } //给安卓使用,安卓那边存完后通知U3D void AndroidSaveHeadImageOver(string str) { StartCoroutine(LoadTexture(str)); } //从安卓中读取贴图 IEnumerator LoadTexture(string name) { string path = "file://" + Application.persistentDataPath + "/" + name; WWW www = new WWW(path); while (!www.isDone) { //没有完成什么都不做,等待 } yield return www; //显示贴图 GetComponent<RawImage>().texture = www.texture; } }
前面几个例子没什么难的,就没有保留工程,最后一个U3D和AndroidStudio选相片图片交互的工程在下面地址下载:
Demo下载地址:http://download.csdn.net/detail/u012322710/9654072
APK安装包忘记传了:http://download.csdn.net/detail/u012322710/9654156
参考博客:http://blog.csdn.net/he_wen_jian/article/details/44040619
参考博客:http://www.xuanyusong.com/archives/1480
相关文章推荐
- 【Unity3D自学记录】浏览器调用本地安卓App
- 调用安卓手机系统的分享功能
- 安卓调用系统拍照功能:1、启动拍照返回图片,2、启动拍照,图片存储在指定路径下
- 基于Unity3D的调用摄像头功能的实现
- Unity3D C# Thread通过JNI调用安卓接口出错
- 安卓调用系统录像功能:1、启动录像返回视频,2、启动录像将视频存储在指定路径下
- 安卓学习笔记---调用相机功能在安卓7.0以上报错android.os.FileUriExposedException
- 安卓调用系统语音识别功能全解(谷歌语音服务):获取识别结果,使用语音识别进行搜索。
- 【XFeng安卓开发笔记】Android开发中如何调用打电话功能
- 记录下最近在研究的使用AndroidStudio 实现untiy3d调用安卓内置的API接口实现刷新相册的功能
- unity3D调用安卓 Toast.makeText
- 安卓自定义相机拍照功能全解(不调用系统相机)
- Unity3D -- 调用手机端发送邮件功能
- 安卓调用系统分享功能
- 于Unity3D调用安卓AlertDialog
- [置顶] 安卓调用系统自带分享功能分享文字,分享大图片,仿好奇心日报分享长图片(不用申请微信微博官方sdk就能直接分享)
- 安卓短信功能全解:调用系统短信功能发送短信、彩信,使用SmsManager发送短信,并监听发送短信的投递情况,使用广播接收器监听接收的短信。
- 201711231640->unity调用安卓震动功能
- 安卓自动更新功能实现+安卓调用默认浏览器打开指定URL
- 安卓下调用系统拍照,系统相册功能实现