Unity与Android交互 选择文件打开方式
Unity游戏开发移动端 ,麻烦的就是与Android交互,现在就教如何在unity中 传入文件路径调用android选择打开方式来查看一个文件:
首先创建一个android项目
进入Android studio 画面如下:
首先我们新建一个模块:
记得选择 android library
创建完如下:
首先我们将unity的jar包导入: 路径位于
G:\unity2017\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes
这时候虽然jar包放进去 但是 还没加入在这个模块中,我们需要右键点击Add as library添加到模块中
添加完 如下:
为了确定该模块是否与jar包 产生依赖 我们去查看模块的依赖 右键open modules setting
打开看到如下,确认模块已经与jar产生依赖关系了
切换一下项目的显示 好进行下一步操作
我们现在就创建一个空的activity:
点击创建后 直接点finish
生成后我们要修改一些配置:先将layout下的xml删除掉 因为我们不需要布局
删除掉后 我们需要把setContentView(R.layout.activity_main);这行代码也删掉 不然有错误
接着我们就开始写代码了
最后代码如下:
package com.study.mylibrary;import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;import com.unity3d.player.UnityPlayerActivity;import java.io.File;public class MainActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();StrictMode.setVmPolicy(builder.build());}}public void show(String filesPath){Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(Intent.ACTION_VIEW);startActivity(openFile(filesPath));}public static Intent openFile(String filePath){File file = new File(filePath);if(!file.exists()) return null;/* 取得扩展名 */String end=file.getName().substring(file.getName().lastIndexOf(".") + 1,file.getName().length()).toLowerCase();/* 依扩展名的类型决定MimeType */if(end.equals("m4a")||end.equals("mp3")||end.equals("mid")||end.equals("xmf")||end.equals("ogg")||end.equals("wav")){return getAudioFileIntent(filePath);}else if(end.equals("3gp")||end.equals("mp4")){return getAudioFileIntent(filePath);}else if(end.equals("jpg")||end.equals("gif")||end.equals("png")||end.equals("jpeg")||end.equals("bmp")){return getImageFileIntent(filePath);}else if(end.equals("apk")){return getApkFileIntent(filePath);}else if(end.equals("ppt")){return getPptFileIntent(filePath);}else if(end.equals("xls")){return getExcelFileIntent(filePath);}else if(end.equals("doc")){return getWordFileIntent(filePath);}else if(end.equals("pdf")){return getPdfFileIntent(filePath);}else if(end.equals("chm")){return getChmFileIntent(filePath);}else if(end.equals("txt")){return getTextFileIntent(filePath,false);}else{return getAllIntent(filePath);}}//Android获取一个用于打开APK文件的intentpublic static Intent getAllIntent( String param ) {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri,"*/*");return intent;}//Android获取一个用于打开APK文件的intentpublic static Intent getApkFileIntent( String param ) {Intent intent = new Intent();intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setAction(android.content.Intent.ACTION_VIEW);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri,"application/vnd.android.package-archive");return intent;}//Android获取一个用于打开VIDEO文件的intentpublic static Intent getVideoFileIntent( String param ) {Intent intent = new Intent("android.intent.action.VIEW");intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);intent.putExtra("oneshot", 0);intent.putExtra("configchange", 0);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "video/*");return intent;}//Android获取一个用于打开AUDIO文件的intentpublic static Intent getAudioFileIntent( String param ){Intent intent = new Intent("android.intent.action.VIEW");intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);intent.putExtra("oneshot", 0);intent.putExtra("configchange", 0);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "audio/*");return intent;}//Android获取一个用于打开Html文件的intentpublic static Intent getHtmlFileIntent( String param ){Uri uri = Uri.parse(param ).buildUpon().encodedAuthority("com.android.htmlfileprovider").scheme("content").encodedPath(param ).build();Intent intent = new Intent("android.intent.action.VIEW");intent.setDataAndType(uri, "text/html");return intent;}//Android获取一个用于打开图片文件的intentpublic static Intent getImageFileIntent( String param ) {Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "image/*");return intent;}//Android获取一个用于打开PPT文件的intentpublic static Intent getPptFileIntent( String param ){Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "application/vnd.ms-powerpoint");return intent;}//Android获取一个用于打开Excel文件的intentpublic static Intent getExcelFileIntent( String param ){Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "application/vnd.ms-excel");return intent;}//Android获取一个用于打开Word文件的intentpublic static Intent getWordFileIntent( String param ){Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "application/msword");return intent;}//Android获取一个用于打开CHM文件的intentpublic static Intent getChmFileIntent( String param ){Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "application/x-chm");return intent;}//Android获取一个用于打开文本文件的intentpublic static Intent getTextFileIntent( String param, boolean paramBoolean){Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (paramBoolean){Uri uri1 = Uri.parse(param );intent.setDataAndType(uri1, "text/plain");}else{Uri uri2 = Uri.fromFile(new File(param ));intent.setDataAndType(uri2, "text/plain");}return intent;}//Android获取一个用于打开PDF文件的intentpublic static Intent getPdfFileIntent( String param ){Intent intent = new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT");intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = Uri.fromFile(new File(param ));intent.setDataAndType(uri, "application/pdf");return intent;}}
代码写完后 ,我们就要修改manifest文件了
我们先拷贝app中的manifest 文件
拷贝完如下:
将报红的删掉,注意删除第三个的时候别把尖括号删掉,不然会报错
现在我们添加一句配置 添加完如下
配置完后我们就要生成aar包,点击 make module
make成功后 可以在该路径中看到一个aar包,将他先复制到桌面,我们需要将aar进行修改
用压缩软件打开aar 显示如下
点进libs 我们可以看到一个classes.jar 我们需要将他删掉 然后把外面的classes.jar放进来
接着我们要改AndroidManifest.xml文件 我们先打开文件 如下:
修改后的文件如下:
之所以删掉 是因为我们等下需要另外一个manifest文件 如果不删掉 会和之后的文件冲突
改完后记得放回aar包中
现在我们将另外一个manifest找到 路径如下:
暂时先拷贝到桌面 打开如下:
如果想更改发布出来安装在手机上apk的名字 则下面@string/app_name 改名成你想要的名字
而如果你想在unity的包名打包,将下图com.study.mylibrary改成unity的包名即可
最后我的minifest如下:
android studio就搞定 现在就请出unity了
新建一个unity 项目后 记得将平台更改为android平台 并将aar和manifest导进来,并且新建一个场景作为测试场景 新建一个脚本用来作为测试脚本 如图下:
脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI ;public class OpenFile : MonoBehaviour {public Text pathText;public Button openFileBtn;public AndroidJavaObject jo;public AndroidJavaClass jc;private void Awake(){jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");jo = jc.GetStatic<AndroidJavaObject>("currentActivity");openFileBtn.onClick.AddListener(OnOpenFileClick);}public void OnOpenFileClick(){//Call 参数第一个 就是android 的函数名 第二个就是你要传的参数 我们要调用android的show的函数 并传string字符串过去jo.Call("show", pathText.text);}}
最后场景如下:
接下来我们就要打包APK
playsetting 配置如下
设置完后直接打包
在手机后运行
路径是我在手机上随便找个文件测试的 按钮点击后效果如下:
点击哪个都可以打开文件 证明是可以的 一下 就是全部过程
补充:
Unity使用Gradle打包的 使用internal 可能有问题 我用unity版本为2017.3.1f
还有注意点就是playersetting
这句一定要选成这个 不然应用没有读写权限 会出问题
如有问题 请联系 第一次写博客 多多关照
Unity与Android交互 选择文件打开方式相关推荐
- Windows10选择文件打开方式没有始终允许的解决方案
有些文件在选择打开方式时,没有"始终使用此应用打开",如图: 这时,右键文件,属性,打开方式点击"更改" 然后选择你要打开的应用,确定,就OK了
- 应用打开方式是计算机程序,电脑文件打开方式里不能选择程序 解决方案
文件的默认打开程序错误,在文件打开方式里面,有一个「始终使用该程序打开这些文件」是灰色的,复选框不能选. 如Axure建立的rp格式文件,被有的播放器当成是流媒体文件,成了默认关联的强行打开程序. 一 ...
- 开发手札:Unity与Android交互
先祝贺我国疫情基本结束,感谢为疫情奉献热血甚至生命的医护人员! 接下来进入正题. 用unity做一个手机app游戏基本上都需要与android和ios交互,比如调用系统函数,调用sdk等.这是unit ...
- jnlp文件打开方式(jnlp文件打开方式Java)
jnlp这个文件打开方式不小心改成网页打开了怎么也回不?inpu 你这个文件的扩展名不对啊!扩展名只有3位,你怎么跑出来4位了,是jnp还是什么,从这个文件上,点鼠标右键,有个打开方式,选一个你想打开 ...
- 【Android取证篇】Android设备USB调试打开方式(开发者模式)
[Android取证篇]Android设备USB调试打开方式(开发者模式) Android各个版本系统手机开启"USB调试"的入口不全相同,仅供参考-[蘇小沐] 1.[Androi ...
- win7电脑上的文件打开方式选错了怎么办
使用电脑的过程中总会遇到各种各样的问题,就有win7用户跟小编反应说自己一不小心选错了文件的打开方式,导致该文件再也打不开了,win7电脑上的文件打开方式选错了怎么办呢?那针对这个问题,小编就给大家讲 ...
- Windows技巧:右键文件打开方式,该文件没有与之关联来执行该操作
Windows技巧:右键文件打开方式,该文件没有与之关联来执行该操作 正文 参考链接 正文 报错如下: 搜索关键词: 文件打开方式 该文件没有与之关联来执行该操作 原因: 右键选择默认文件打开方式相关 ...
- 计算机文件右击怎么显示打开方式,修复鼠标右键点击文件打开方式在win10中没有反应...
当我们在电脑中需要打开文件夹的不同设置的选项的时候是可以直接在鼠标的右键中进行设置打开的,选择文件的不同的打开的时候有小伙伴在win10电脑中点击右键发现没有反应的情况遇到这个问题我们怎么恢复右键的使 ...
- Win7上.bat文件打开方式变成了文本文档,怎么修改和恢复
第一步:我们点击自己电脑桌面左下角的Windows桌面图标,如下图所示,此时将弹出Windows程序菜单界面,我们找到[控制面板],然后点击打开[控制面板]. 第二步:打开[控制面板]界面后,如下图所 ...
最新文章
- linux查看地址和,UNIX/LINUX平台下查看MAC和WWN地址的方法
- C#把数据写到硬盘指定位置
- mciSendString用法
- Windows Subsystem for Linux (WSL)简单尝试
- 互联网经济与实体经济
- 天了噜,Java 8 要停止维护了!
- Java—jsp编程
- 第十五章 面向对象程序设计
- Appium自动化测试(Java版)
- mysql myd文件过大_Mysql数据文件大小超过4G了如何缩小优化
- this beta version of Typora is expired, please download and install a newer version.Typora
- 淡季来临,淘宝新开店铺该如何是好
- ts 手动实现 ts 中的map
- js版身份证省市性别查询
- Android中startActivities的准确用法
- nbu Linux 邮件告警,Netbackup配置邮件警报
- [css]我要用css画幅画(七) - 哆啦A梦
- 2020云盘点:信创云蓬勃发展,带动中国云计算市场快速增长
- “海马体”平替教程:把拍海马体的钱省下来买排骨不香嘛?好用哭了
- Leetcode面试题 10.01. 合并排序的数组(C语言)
热门文章
- 不懂如何在图片上添加贴纸?马上教你图片加贴纸方法
- 制作一个斜三角履带底盘【内附资料下载链接】
- 老鸟聊运维 | 女生可不可以进入IT行业做Linux运维工程师?
- JavaScript实现同步Ajax请求的两种方式
- 怎样用计算机弹捉泥鳅,捉泥鳅、打油菜、做弹弓,这样的研学活动你想参加吗?...
- 计算1到100自然数之和(用while语句)
- visual studio和java_程序员注意了,重大消息!Visual Studio已支持Java语言!
- javascript 中 offsetWidth 是什么意思?
- 盛战—全球首款提升生命源动力的饮品
- 低功耗蓝牙数据传输率