切记:调用这项安卓系统服务都要在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;
    }

	

}




前面几个例子没什么难的,就没有保留工程