• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

常州手机游戏开发-Unity3d挪用安卓功能

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0323/421.html

常州手机游戏开发-Unity3d挪用安卓功能

 

 

游戏开垦中举行会用到和本生组件举行彼此挪用,而挪用这项安卓体系效劳都要在AndroidManifest.xml里写入获得权力。以下例子的条件是已完毕了Unity3dAndroid Studio的接互

 

 

一、挪用振动

 

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写代码挪用,挪用办法参照:Android Studio导出jar包并在Unity3d中运用

 

二、挪用瓜分功效

 

直接写代码,能实行简略的瓜分功效,运用 shareSDK插件 能实行更丰厚的功效。

    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也不妨传播数据,二个辨别:intentBundle的封装

        //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.huan.tian/files/myCall.jpg");

            //压缩图片 参数1:图片方法    参数2:压缩率100表现不压缩   参数3:写入输入流

            bitmap.compress(Bitmap.CompressFormat.PNG, 100, bitmapOut);

            //道输入流革新写出到磁盘

            bitmapOut.flush();

            //闭闭流

            bitmapOut.close();

            //报告U3D不妨读取图片了  参数1U3D物体称呼   参数2:办法名   参数3:要传播的参数,此地传图片称呼

            UnityPlayer.UnitySendMessage("myCall","MyCallOver","myCall.jpg");

        

    

 

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");   //获得unityJava,只可挪用固态办法,获得固态属性

        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");      //获得目前的Activity对于象,能挪用公然办法和公然属性

        //一发端便挪用安卓采用图片

        jo.Call("SelectPhoto"); 

    

    //给安卓运用,安卓何处存完后报告U3D

    void myCallOver(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;

    

前方几个例子没什么难的,便不保持工程,末尾一个U3DAndroid Studio选相片图片接互的工程鄙人面地方下载:


上篇:上一篇:常州手游开发-u3d溶解shader
下篇:下一篇:常州手游开发-Unity3d委托模式详解