当前位置:   article > 正文

android studio开发<十四> Unity3d调用安卓功能_在androidstudio中import com.unity3d.player.unityplay

在androidstudio中import com.unity3d.player.unityplayeractivity;

原创


切记:调用这项安卓系统服务都要在AndroidManifest.xml里写入  获取权限。

以下例子的前提是已完成了Unity3d和AndroidStudio的交互,具体看上一篇博文。


一.调用震动

1.写入权限   <uses-permission android:name="android.permission.VIBRATE"/>

2. 写安卓代码

  1. import com.unity3d.player.UnityPlayerActivity;
  2. import android.os.Vibrator; //导入震动包
  3. import android.app.Service; //导入手机应用服务包
  4. //继承自unity包的UnityPlayerActivity类
  5. public class MainActivity extends UnityPlayerActivity {
  6. public Vibrator vibrator; //声明震动器
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. // setContentView(R.layout.activity_main); 注释掉 不显示View
  11. }
  12. //给U3D调用的震动函数
  13. public void ClickShake() {
  14. vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);//获取手机震动服务
  15. //参数是2个一组,前一个表示延迟时间,后一个表示持续时间,立即开始,持续2秒,接着延迟5秒开始,持续1秒
  16. //自定义震动模式,-1表示只震动一次,非-1则表示指定下标开始重复震动。并不是说3就是震动3次。
  17. vibrator.vibrate(new long[]{0, 2000,5000 ,1000}, -1);
  18. //vibrator.hasVibrator() 是否有Vibrator
  19. // vibrator.cancel() 关闭震动
  20. // vibrator.vibrate(5000) 震动5秒
  21. }
  22. }

3.U3D写代码调用,调用方法看上一篇文章。


二.调用分享功能

直接写代码,能实现简单的分享功能,使用 shareSDK插件 能实现更丰富的功能。

shareSDK分享插件:http://www.mob.com


  1. public void OnShare()
  2. {
  3. Intent shareInt = new Intent(Intent.ACTION_SEND); //新建发送Intent
  4. shareInt.setType("text/plain"); //纯文本
  5. shareInt.putExtra(Intent.EXTRA_SUBJECT, "选择分享方式"); // 分享主题
  6. shareInt.putExtra(Intent.EXTRA_TEXT, "快来下载这款游戏和我一起玩吧!"); // 分享的内容
  7. shareInt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//应用没打开的话打开一个应用,打开了切换
  8. shareInt = Intent.createChooser(shareInt, "分享啊!");//应用选择器,第二个参数是弹窗标题
  9. startActivity(shareInt);
  10. }



三.调用发送短信

如果只是发送其实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. 写安卓代码

  1. import android.app.Activity;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.IntentFilter;
  6. import android.widget.Toast;
  7. import android.app.PendingIntent;
  8. //发送短信库
  9. import android.telephony.SmsManager;
  10. //继承自unity包的UnityPlayerActivity类
  11. public class MainActivity extends UnityPlayerActivity {
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. // setContentView(R.layout.activity_main); 注释掉 不显示View
  16. // 注册广播 发送消息
  17. registerReceiver(sendMessage, new IntentFilter("SENT_SMS_ACTION"));
  18. registerReceiver(receiver, new IntentFilter("DELIVERED_SMS_ACTION"));
  19. }
  20. //发送广播
  21. private BroadcastReceiver sendMessage = new BroadcastReceiver() {
  22. @Override
  23. public void onReceive(Context context, Intent intent) {
  24. //判断短信是否发送成功
  25. switch (getResultCode()) {
  26. case Activity.RESULT_OK:
  27. Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show();
  28. break;
  29. default:
  30. Toast.makeText(MainActivity.this, "短信发送失败", Toast.LENGTH_LONG).show();
  31. break;
  32. }
  33. }
  34. };
  35. //接收广播
  36. private BroadcastReceiver receiver = new BroadcastReceiver() {
  37. @Override
  38. public void onReceive(Context context, Intent intent) {
  39. //表示对方成功收到短信
  40. Toast.makeText(MainActivity.this, "对方接收成功",Toast.LENGTH_LONG).show();
  41. }
  42. };
  43. //发送短信
  44. //参数1:收信人手机号 2:发信人手机号 3:短信内容 4:发送是否成功的回执 5:接受是否成功的回执
  45. public void SMSSend(String number, String content){
  46. Intent sentIntent = new Intent("SENT_SMS_ACTION");
  47. PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, 0);
  48. Intent deliverIntent = new Intent("DELIVERED_SMS_ACTION");
  49. PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0, deliverIntent, 0);
  50. SmsManager sms = SmsManager.getDefault(); //获取短信管理器
  51. sms.sendTextMessage(number, null, content, sentPI, deliverPI); //发送短信
  52. }



四.调用相册选择图片给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. 写安卓代码

  1. package com.zou.chongyang;
  2. import android.content.Intent;
  3. import android.graphics.Bitmap;
  4. import android.net.Uri;
  5. import android.os.Bundle;
  6. import android.widget.Toast;
  7. import com.unity3d.player.UnityPlayer;
  8. import com.unity3d.player.UnityPlayerActivity;
  9. import java.io.File;
  10. import java.io.FileOutputStream;
  11. import java.io.IOException;
  12. //发送短信库
  13. //继承自unity包的UnityPlayerActivity类
  14. public class MainActivity extends UnityPlayerActivity {
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. // setContentView(R.layout.activity_main); 注释掉 不显示View
  19. }
  20. //给U3D调用的打开相册
  21. public void SelectPhoto()
  22. {
  23. //Intent就是应用之间,应用不同Activity之间交互。
  24. Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT); //新建Intent,让用户选择特定类型的数据,并返回该数据的URI.
  25. getAlbum.setType("image/*"); //类型为图片
  26. startActivityForResult(getAlbum, 108); //调用相册,结果码108,如果有结果会返回108,这个值随便设置,只要>=0就行
  27. }
  28. //重写Activity里的onActivityResult方法,这个方法和startActivityForResult是一对出现。
  29. @Override
  30. protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
  31. // 用户没有进行有效的设置操作,返回系统固定的常量RESULT_CANCELED=0
  32. if (resultCode == RESULT_CANCELED) {
  33. Toast.makeText(getApplication(), "没有选择图片", Toast.LENGTH_LONG).show();
  34. return;
  35. }
  36. switch (requestCode) {
  37. case 108:
  38. Toast.makeText(getApplication(), "图片挑选完成", Toast.LENGTH_LONG).show();
  39. //裁剪图片
  40. CropPhoto(intent.getData());//获取资源的Uri,安卓Uri通用资源标识符,表示一个图片或视频
  41. break;
  42. case 109:
  43. Toast.makeText(getApplication(), "图片裁剪完成", Toast.LENGTH_LONG).show();
  44. //保存图片
  45. //可能抛出异常方法IOException方法必须用Try
  46. try {
  47. SaveImage(intent);
  48. }
  49. catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. break;
  53. }
  54. super.onActivityResult(requestCode, resultCode, intent);
  55. }
  56. //裁剪图片
  57. public void CropPhoto(Uri uri) {
  58. //调用裁剪器
  59. Intent intent = new Intent("com.android.camera.action.CROP");
  60. intent.setDataAndType(uri, "image/*");
  61. // 开启裁剪功能
  62. intent.putExtra("crop", "true");
  63. //设置宽高的比例
  64. intent.putExtra("aspectX", 1);
  65. intent.putExtra("aspectY", 1);
  66. //裁剪图片宽高
  67. intent.putExtra("outputX", 100);
  68. intent.putExtra("outputY", 100);
  69. //请求返回数据
  70. intent.putExtra("return-data", true);
  71. startActivityForResult(intent, 109); //结果码109
  72. }
  73. //保存裁剪图片供U3D读取 使用 FileOutputStream 必须要捕获和处理错误 抛出异常IOException
  74. private void SaveImage(Intent intent) throws IOException {
  75. //获取intent传过来的数据
  76. //Bundle类是键值对形式,传递数据 Intent也可以传递数据,两个区别:intent是Bundle的封装
  77. //Intent主要数据传递用,bundle主要存取数据用。
  78. Bundle extras = intent.getExtras();
  79. if (extras != null) {
  80. //取出数据
  81. Bitmap bitmap = extras.getParcelable("data");
  82. //文件路径=U3D里的Application.persistentDataPath路径
  83. File destDir = new File("/mnt/sdcard/Android/data/com.zou.chongyang/files");
  84. //如果没有这个目录,创建一个
  85. if(!destDir.exists())
  86. {
  87. destDir.mkdirs();
  88. }
  89. //创建图片数据输出流
  90. FileOutputStream bitmapOut = new FileOutputStream("/mnt/sdcard/Android/data/com.zou.chongyang/files/headImage.png");
  91. //压缩图片 参数1:图片格式 参数2:压缩率100表示不压缩 参数3:写入输出流
  92. bitmap.compress(Bitmap.CompressFormat.PNG, 100, bitmapOut);
  93. //讲输出流刷新写出到磁盘
  94. bitmapOut.flush();
  95. //关闭流
  96. bitmapOut.close();
  97. //通知U3D可以读取图片了 参数1:U3D物体名称 参数2:方法名 参数3:要传递的参数,这里传图片名称
  98. UnityPlayer.UnitySendMessage("headImage","AndroidSaveHeadImageOver","headImage.png");
  99. }
  100. }
  101. }

3.Unity3d代码

  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEngine.UI;
  4. public class androidU3D : MonoBehaviour
  5. {
  6. //按钮事件
  7. public void OnSelectPhoto()
  8. {
  9. AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //获取unity的Java类,只能调用静态方法,获取静态属性
  10. AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"); //获取当前的Activity对象,能调用公开方法和公开属性
  11. //一开始就调用安卓选择图片
  12. jo.Call("SelectPhoto");
  13. }
  14. //给安卓使用,安卓那边存完后通知U3D
  15. void AndroidSaveHeadImageOver(string str)
  16. {
  17. StartCoroutine(LoadTexture(str));
  18. }
  19. //从安卓中读取贴图
  20. IEnumerator LoadTexture(string name)
  21. {
  22. string path = "file://" + Application.persistentDataPath + "/" + name;
  23. WWW www = new WWW(path);
  24. while (!www.isDone)
  25. {
  26. //没有完成什么都不做,等待
  27. }
  28. yield return www;
  29. //显示贴图
  30. GetComponent<RawImage>().texture = www.texture;
  31. }
  32. }


前面几个例子没什么难的,就没有保留工程,最后一个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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/1012272
推荐阅读
相关标签
  

闽ICP备14008679号