实现安卓程序退出后重进自己程序的一个小功能(android,unity)

[Unity][安卓]Unity和Android Studio 3.0 交互通讯(1)Android Studio 3.0 设置 参考资料: 1.[自学总结] Unity调用 Android 接口实践与总结(Unity5.6 和 Eclipse 及 AndroidStudio2.3.1) http://www.manew.com/thread-103445-1-1.html 2. 3. 4. 阅读详情

本人是初来乍到的小菜鸟,可能说的有些地方不对,请批评指出,谢谢^v^
首先,我们要做的是安卓程序退出时能重新打开我们这个安卓程序,所以这些知识都涉及到安卓开发,但是我们所做的安卓项目,是由unity打包出来的,所以最开始要知道unity是如何跟安卓交互的。这里提供几篇博客教你如何用unity跟安卓交互:http://www.jianshu.com/p/7e46fe7485bb
http://blog.youkuaiyun.com/myarrow/article/details/46342371
你需要知道的就是,安卓调用unity的方式通过unity中的一个classes.jar,里面有一个UnityPlayer.UnitySendMessage方法,是安卓通知到unity的一个方法。
UnityPlayer.UnitySendMessage("GameObject", "Method", "arg");
三个参数,第一个参数是说要发给游戏场景中的哪一个游戏物体,第二个参数表示要调用游戏物体上挂载脚本的哪个方法,第三个参数表示调用者方法你要给他传递什么参数,三个参数都是string类型。
接着是unity调用安卓,这里就简单说一下,不多累赘,就是首先要将你的安卓场景Activity继承自UnityPlayerActivity,然后在Activity中写一些你自己需要被调用的方法,接着在unity中 写入这些代码

 AndroidJavaClass jc = newAndroidJavaClass("com.unity3d.player.UnityPlayer");
 AndroidJavaObject jo = jc.Get<AndroidJavaObject>("currentActivity");
 jo.Call("方法名", "参数");
 jo.CallStatic("方法名", "参数1","参数2");

call表示调用普通方法,CallStatic表示调用静态方法,参数是可以多个的。

接着我们需要理解的一个就是安卓应用Activity的一个生命周期,他的生命周期就跟我们unity的生命周期差不多,这里提供一个博客:http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html
这里的生命周期就是指的Activity的生命周期:
生命周期
这些生命周期的函数,跟unity一样,是写在Activity中的,代码如下:

public class MainActivity extends UnityPlayerActivity {
    private static final String TAG = "MainActivity ";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG , "MainActivity onDestroy");
        super.onCreate(savedInstanceState);     
    }
    @Override
    protected void onDestroy(){
        Log.i(TAG , "MainActivity onDestroy");
        super.onDestroy();
    }
}

好了,接着我们进入正题,如何让安卓程序退出后重新打开我们的程序,第一步,我们要知道一个东西,就是安卓是如何打开另外一个应用的,这里提供几篇博客:
http://blog.youkuaiyun.com/zml_2015/article/details/50413597 (需要包名和Activity名)
http://blog.youkuaiyun.com/mad1989/article/details/38090513 (只需要包名)
简单说一下,我们要打开一个安卓程序,我们就必须知道对应安卓程序的包名(也就是unity项目中打包时的Bundle Identifier),然后还需要一个className,也就是我们的Activity的名字,不知道Activity名字也不要紧,看第二个博客,只通过包名打开一个应用。

private void doStartApplicationWithPackageName(String packagename) {  

    // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等  
    PackageInfo packageinfo = null;  
    try {  
        packageinfo = getPackageManager().getPackageInfo(packagename, 0);  
    } catch (NameNotFoundException e) {  
        e.printStackTrace();  
    }  
    if (packageinfo == null) {  
        return;  
    }  

    // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent  
    Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);  
    resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
    resolveIntent.setPackage(packageinfo.packageName);  

    // 通过getPackageManager()的queryIntentActivities方法遍历  
    List<ResolveInfo> resolveinfoList = getPackageManager()  
            .queryIntentActivities(resolveIntent, 0);  

    ResolveInfo resolveinfo = resolveinfoList.iterator().next();  
    if (resolveinfo != null) {  
        // packagename = 参数packname  
        String packageName = resolveinfo.activityInfo.packageName;  
        // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]  
        String className = resolveinfo.activityInfo.name;  
        // LAUNCHER Intent  
        Intent intent = new Intent(Intent.ACTION_MAIN);  
        intent.addCategory(Intent.CATEGORY_LAUNCHER);  

        // 设置ComponentName参数1:packagename参数2:MainActivity路径  
        ComponentName cn = new ComponentName(packageName, className);  

        intent.setComponent(cn);  
        startActivity(intent);  
    }  
}  

好了,这就是通过包名打开另外一个应用的方法,你会发现,现在只是我们功能最开始的一个小实现,已经可以打开一个应用了,但是这仅仅只是开始。
接着呢,因为我们需要退出后打开自己这个应用,所以我们把这方法写在了上面的OnDestroy方法中,如下所示:

public class MainActivity extends UnityPlayerActivity {
    static boolean ReOpen = false;//定义一个变量,通过unity去改变这个变量
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);     
    }
    @Override
    protected void onDestroy(){
        if(ReOpen){
            //通过包名打开你的项目
            doStartApplicationWithPackageName("com.xxx.xxx");
        }
        super.onDestroy();
    }
    //这个方法需要再unity中去调用,然后退出时才会重新打开我们的项目,就是设置一个开关
    public void ReOpen(){
        //UnityPlayer.UnitySendMessage("Cube", "CallBack", "setReOpen");
        ReOpen = true;
    }
    private void doStartApplicationWithPackageName(String packageName){
        //打开项目的代码...
    }
}

然后这样写完之后,你就会发现,这并没有什么用,因为,你一旦退出后,就会提示出一个xxx已停止运行,它已经报错了,为什么呢?因为你的这个打开操作时基于intent,你都已经杀死了这个而程序的进程了,他都不工作了,怎么可能再给你打开一个应用,所以只有在你Activity生命周期还活着的情况下,才能打开另外一个应用。那怎么办呢?
这时就需要用到我们安卓的四大组件之一——service(服务),这个service的用法,我提供几篇博客供学习:
http://blog.youkuaiyun.com/guolin_blog/article/details/11952435/
http://www.2cto.com/kf/201404/296058.html
http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html
用法跟Activity差不多,就是要继承自Service,然后最主要的就是需要再你的AndroidManifest.xml中去配置一下你的Service
代码:

public class ReOpenService extends Service {  

    public static final String TAG = "ReOpenService";  

    @Override  
    public void onCreate() {  
        super.onCreate();  
        Log.d(TAG, "onCreate() executed");  
    }  

    @Override  
    public int onStartCommand(Intent intent, int flags, int startId) {  
        Log.d(TAG, "onStartCommand() executed"); 
        //在这里写上你需要做的事情,我个人一般喜欢在这里创建一个线程Thread去持续执行一些东西
        return super.onStartCommand(intent, flags, startId);  
    }  
      //可以写上你自己的方法,然后去调用它
    private void yourMethod(){
        //刚刚开启应用的方法,就可以写在这里
    }
    @Override  
    public void onDestroy() {  
        super.onDestroy();  
        Log.d(TAG, "onDestroy() executed");  
    }  

    @Override  
    public IBinder onBind(Intent intent) {  
        return null;  
    }  

}  

然后是在AndroidManifest.xml去配置,这个配置要写在中

    <application
        android:allowBackup="true"
        android:icon="  "
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!--在这里写上你的service的配置-->
        <service android:name="com.xxx.xxx.ReOpenService" ></service> 
    </application>

配置好后,最后是启用service,我们需要再Activity中去启用它,在刚刚的onDestroy方法中启用,需要一个intent参数,这个参数需要两个类名参数,第一个是你的Activity类型,一个是你的service的类型

    @Override
    protected void onDestroy(){
        if(ReOpen){
            Intent intent = new Intent(MainActivity.this,ReOpenService.class);
            startService(intent);
        }
        super.onDestroy();
    }

这样就算是完成了,但是同样的,跑起来后,如果你多打印几个Log,会发现,我们的这个服务,一打开就会被杀死,老样子,还是会提示xxx程序已停止运行,也就是说,目前我们的这个service是基于我们这个程序的,程序一旦死亡,service也会结束。所以我们需要对这个service进行保活操作,就是防止这个service死亡,程序死了,但是要让service不死,这就需要对我们的service进行一个保活,也是安卓守护进程的一个实现。
这里提供几篇博客:
http://www.jianshu.com/p/b16631a2fe3c
https://www.zhihu.com/question/21859600
http://blog.youkuaiyun.com/liangxanhai/article/details/7752898(守护进程概念)
http://blog.youkuaiyun.com/xiaobaifeiji/article/details/51225063(保活)
http://blog.youkuaiyun.com/t12x3456/article/details/8982198(几种service的保活)
我的service最后实现的代码:

public class ReOpenService extends Service {  
    private static Thread mThread;
    private static final String TAG = "ReOpenService";   
    // 守护进程 Service ID
    private final static int DAEMON_SERVICE_ID = 2;
    @Override  
    public void onCreate() {
        Log.i(TAG, "ReOpenService-onCreate");  
        super.onCreate();  
    }  

    @SuppressWarnings("deprecation")
    @Override  
    public void onStart(Intent intent, int startId) {  
        super.onStart(intent, startId);  
        Log.i(TAG, "ReOpenService-onStart");  
    }  

    @Override  
    public int onStartCommand(Intent intent, int flags, int startId) {  
        //执行文件的下载或者播放等操作  
        Log.i(TAG, "ReOpenService-onStartCommand:" + DAEMON_SERVICE_ID + PackageName); 
     // 利用 Android 漏洞提高进程优先级,
        startForeground(DAEMON_SERVICE_ID, new Notification());
        // 当 SDk 版本大于18时,需要通过内部 Service 类启动同样 id 的 Service
        if (Build.VERSION.SDK_INT >= 18) {
            Intent innerIntent = new Intent(this, DaemonInnerService.class);
            startService(innerIntent);
        }
        //执行我们需要执行的方法
        TestMethod();
        /*  
         * 这里返回状态有三个值,分别是:
         * 1、START_STICKY:当服务进程在运行时被杀死,系统将会把它置为started状态,但是不保存其传递的Intent对象,之后,系统会尝试重新创建服务;  
         * 2、START_NOT_STICKY:当服务进程在运行时被杀死,并且没有新的Intent对象传递过来的话,系统将会把它置为started状态,  
         *   但是系统不会重新创建服务,直到startService(Intent intent)方法再次被调用;  
         * 3、START_REDELIVER_INTENT:当服务进程在运行时被杀死,它将会在隔一段时间后自动创建,并且最后一个传递的Intent对象将会再次传递过来。  
         */  

        return START_STICKY;
    }  
    //自己需要执行的方法
    private void TestMethod() {
        Log.i(TAG, "test method"); 
        if (mThread == null || !mThread.isAlive()) {
            Log.i(TAG, "create Thread"); 
            mThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //Thread.sleep(1000);原来想延时1秒,但是后来发现不需要了
                        //打开我们的包名的方法
                        doStartApplicationWithPackageName();
                    } catch (Exception e) {
                        //这里最好这么写,因为这样可以看出你执行时报了什么错误,好进行修改
                        Log.e(TAG, "Exception Message : " + e.getMessage()); 
                    }finally{
                        StopServiceSelf();
                    }

                }
            });

            mThread.start();
        }
    }

    //service杀死自己的方法
    private void StopServiceSelf(){
        this.stopSelf();
    }

    @Override  
    public IBinder onBind(Intent intent) {  
        Log.i(TAG, "ReOpenService-onBind");  
        return null;  
    }  

    @Override  
    public void onDestroy() {
        Log.i(TAG, "ReOpenService-onDestroy");  
        super.onDestroy();  
    }  

    private void doStartApplicationWithPackageName() {  
        //获取我们自己这个项目的包名,也是AndroidManifest中的包名
        String packagename = this.getPackageName();
        Log.i(TAG, "ReOpenService-doStartApplication : "+packagename);  
        // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等  
        PackageInfo packageinfo = null;  
        try {  
            packageinfo = getPackageManager().getPackageInfo(packagename, 0);  
        } catch (NameNotFoundException e) {  
            e.printStackTrace();  
        }  
        if (packageinfo == null) {  
            return;  
        }  

        // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent  
        Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);  
        resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
        resolveIntent.setPackage(packageinfo.packageName);  

        // 通过getPackageManager()的queryIntentActivities方法遍历  
        List<ResolveInfo> resolveinfoList = getPackageManager()  
                .queryIntentActivities(resolveIntent, 0);  

        ResolveInfo resolveinfo = resolveinfoList.iterator().next();  
        if (resolveinfo != null) {  
            // packagename = 参数packname  
            String packageName = resolveinfo.activityInfo.packageName;  
            // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]  
            String className = resolveinfo.activityInfo.name;  
            // LAUNCHER Intent  
            Intent intent = new Intent(Intent.ACTION_MAIN);  
            intent.addCategory(Intent.CATEGORY_LAUNCHER);  

            // 设置ComponentName参数1:packagename参数2:MainActivity路径  
            ComponentName cn = new ComponentName(packageName, className);  

            intent.setComponent(cn);  
            //这里需要添加的一个flag,不然那会报错,打不开应用
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);  
        }  
    }  

    /**
     * 实现一个内部的 Service,实现让后台服务的优先级提高到前台服务,这里利用了 android 系统的漏洞,
     * 不保证所有系统可用,测试在7.1.1 之前大部分系统都是可以的,不排除个别厂商优化限制
     */
    public static class DaemonInnerService extends Service {

        @Override public void onCreate() {
            Log.i(TAG, "DaemonInnerService -> onCreate");
            super.onCreate();
        }

        @Override public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i(TAG, "DaemonInnerService -> onStartCommand");
            startForeground(DAEMON_SERVICE_ID, new Notification());
            stopSelf();
            return super.onStartCommand(intent, flags, startId);
        }

        @Override public IBinder onBind(Intent intent) {
            // TODO: Return the communication channel to the service.
            throw new UnsupportedOperationException("onBind 未实现");
        }

        @Override public void onDestroy() {
            Log.i(TAG, "DaemonInnerService -> onDestroy");
            super.onDestroy();
        }
    }
}

关于上面代码,最后需要提几点:
1、守护进程需要一个serviceID,然后设置startForeground,这样保证我们的额service的优先级比较高,不容易被杀死,接着在onStartCommand中返回值写成START_STICKY,这样可以保证service在死亡时可以再次被激活。
2、我们这样保活后的service,已经不依赖于我们的Activity了,所以我们项目推出后,service还是会正常跑起来的,而不会呗异常中断,所以我们在调用打开应用时,需要添加一个叫做FLAG_ACTIVITY_NEW_TASK的flag,不然会报错
提供几篇博客:
http://blog.youkuaiyun.com/dct8888/article/details/52064160
http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html
http://blog.youkuaiyun.com/debuglog/article/details/7249444
添加flag的代码如下:

Intent intent = new Intent(Intent.ACTION_MAIN); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

3、关于如何获取包名,因为我们要打开自己这个应用,所以需要获取包名的操作,关于这个操作,提供几篇博客,有助于学习安卓中的一些可获取的信息类:
http://www.cnblogs.com/fly_binbin/archive/2012/08/17/2644119.html
http://blog.youkuaiyun.com/ddiagw/article/details/41308621
http://blog.youkuaiyun.com/true100/article/details/51028468
代码:

String packagename = this.getPackageName();

这样就算是结束了,最后,希望这篇博客能帮助到你!

***********以下为2017/8/18修改添加************

最后的最后=。=我给个提醒,该方法是针对机型的,有些机型(比如小米),好像是不支持这样启动一个service,就会导致,有的机型可以正常启动,有的机型启动不起来,所以后来,我朋友给我推荐了一个stackoverflow博客,歪果仁写的,实现自启动方法,而且不再看机型,代码就几行,完全不需要开启service,下面分享给大家:
博客:https://stackoverflow.com/questions/15564614/how-to-restart-an-android-application-programmatically
代码:

        Intent i = getBaseContext().getPackageManager()
                 .getLaunchIntentForPackage( getBaseContext().getPackageName() );
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);   

只需要在OnDestroy时调用就可以了:

    @Override
    protected void onDestroy(){
        Log.i("ReOpenService", "MainActivity onDestroy");
        if(ReOpen){
            ReStart();
        }
        super.onDestroy();
    }

    private void ReStart() {
        Log.i("ReOpenService", "ReStart Game!");
        Intent i = getBaseContext().getPackageManager()
                 .getLaunchIntentForPackage( getBaseContext().getPackageName() );
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(i);   
    }
[Unity][Android]安卓手机设备动态获取权限 Unity Asset Store里面 AndroidRuntimePermissions插件 参考资料: 1.Unity 安卓权限、动态安卓权限 2. 阅读详情

相关推荐

Unity在安卓中退出activity会kill掉整个APP问题

最近用Unity开发AR项目中遇到Unity在安卓APP中退出activity时会kill掉整个的APP问题,  本来目的是在Unity界面上点击一个返回按钮从而退出UnityPlayerActivity,但发现直接finish UnityPlayerActivity会将整个APP kill掉而不是返回到上一个activity。究其原因是UnityPlayerActivity在onDestroy中

airgreen的博客 7249

Android应用退出后重新开启

通过杀死进程退出Android应用时,防止AMS重启应用的注意事项

zhjali123的专栏 3780

Unity安卓端实现开机自动启动教程

自定义一个类,代码如下:@Override// 执行开机启动逻辑Android权限模型是应用安全和隐私的重要组成部分。从Android 6.0(API级别23)开始,Google引入了运行时权限,以使用户能够在应用运行时授权或拒绝敏感权限。这意味着,应用在运行时需要向用户显式请求权限,而不是在安装时一次性获得所有权限。权限请求分为两类:- 普通权限:不需要用户明确授权,系统自动授予。- 危险权限:涉及到用户隐私或设备敏感功能的权限,需要用户明确授权。

weixin_36059856的博客 1112

Unity 项目游戏退出代码

执行方法之前需要把一些存储数据存储下来 public void OnExitGame() { #if UNITY_EDITOR//在编辑器模式退出 UnityEditor.EditorApplication.isPlaying = false; #else//发布后退出 Application.Quit(); #endif }

ManHua的博客 5135

半桥LLC谐振变换器及同步整流MATLAB仿真(一)

LLC工作原理详细解析,工作过程详细拆解

qq_55203246的博客 3万+

倍福TC3 PLC高速采集实战:如何用PLC-Recorder实现0.24ms级时间戳同步

本文详细介绍了倍福TC3 PLC与PLC-Recorder实现0.24ms级时间戳同步的工程实践方案。通过硬件拓扑设计、时间源选择优化、报文结构封装及同步验证方法,为工业自动化领域的高精度数据采集提供了可靠解决方案,特别适用于精密装配、激光切割等微秒级同步要求的场景。

weixin_29193359的博客 374

Unity安卓端重启游戏

关掉游戏,然后再重新启动。不是重新加载入口场景 public void RestartAndroid() { if (Application.isEditor) return; using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { const int kIntent_FLAG_ACTIVITY_CLEAR_TASK = 0x00008000; .

qq_33205561的博客 5574

PLDM入门(七):FRU Data Format

每个字段为TLV(Type-Length-Value)格式,具体类型、长度范围和值定义需参考。通过条件过滤(记录句柄、类型、字段类型等)分块获取FRU记录数据(可选功能)。整个FRU数据表由多个FRU记录数据块组成,每个数据块对应表2的结构(即包含。决定,每个字段按顺序排列(Type→Length→Value)通过分块传输方式写入FRU记录表数据(需终端支持写入操作)。(文档未提供表5内容,需结合标准文档完整版)。、字段数量、编码类型及具体字段的TLV数据)。无请求数据(空请求)。

weixin_44032634的博客 1764

unity打包安卓运行保持常亮

最近打包安卓,策划提出一个需求打出安卓包保持常亮,不锁屏 只需要在Awake,Start中调用下面函数 Screen.sleepTimeout = SleepTimeout.NeverSleep;//不锁屏设置

weixin_44431724的博客 918

Protege本体建模实战:从零构建电影知识图谱并导入Neo4j

本体建模是知识图谱构建的基石,通过类、属性、实例和约束系统描述领域知识,为数据提供可复用的语义骨架。OWL作为本体描述语言的标准,配合Protege工具可实现可视化建模,并借助推理机验证逻辑一致性,提升模型可靠性。在工程落地中,本体模型常需导入图数据库如Neo4j,以支持高效的关联查询与业务应用。本文以影视领域为背景,完整演示Protege中定义类层级、创建对象/数据属性、填充实例,以及导出OWL文件并通过Python脚本转换为Neo4j节点与关系的全过程,同时梳理命名空间、匿名节点、编码等易踩坑点,帮助读

weixin_29047545的博客 283

vlan的LWIP使用配置

VLAN (Virtual Local Area Network)是将大的广播域划分为小的域的逻辑概念。VLAN协议基于IEEE 802.1Q。VLAN可以看作是一个子网。两个不同的子网在没有网桥或路由器的情况下无法相互通信。

weixin_43084908的博客 720

Unity中实现退出游戏功能

在编辑器环境下退出编辑器,在非编译器环境下退出游戏

和我一起学习 1万+

28、基准剂量法:原理、应用与计算详解

本文详细介绍了基准剂量法(BMD)的原理、在监管机构中的应用以及具体的计算方法。内容涵盖样本量与BMD的关系、主要监管机构如EPA对BMD的应用、BMD的模型选择与数据拟合过程、拟合优度评估、下置信限(BMDL)计算,以及实验设计对BMD结果的影响。同时,还讨论了剂量指标和响应选择的关键问题,为理解和应用基准剂量法提供了全面的参考。

info6的博客 281

Unity使用AVPro在安卓端播放视频时退出重进应用后视频不能正常加载

最近做了一个视频交互的Demo,Unity自带的VideoPlayer组件就不说了,太难用了,PC端勉勉强强还能凑合,到了Android和WebGL之后,经常出现视频加载不出来的现象,所以采用了AVPro插件来实现视频播放,不得不说,做的比VideoPlayer好多了。不过这款插件在打包安卓端之后,利用Unity自带的Application.Quit()退出应用,再次进入应用后,发现视频放不了了,这应该和插件本身有关系。 经测试 1、若使用Application.Quit退出程序,再次进入应用后视频无法加载

weixin_38484443的博客 2041

uniapp [安卓苹果App端] - 详细实现自定义水印相机功能,调用手机摄像头打开相机并在周围悬挂自定义水印,使用相机拍照后添加水印文字或样式,uniapp APP端水印相机完整源码,兼容强大可靠

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果app,水印相机,uniapp水印相机,Uniapp安卓app实现水印相机,uniapp苹果ios水印相机,打开系统相机拍照添加水印,地点打卡相机,水印相机(水印照片,图片加水印),uniapp自定义水印相机,制作水印相机给图片添加水印并且保存图片至本地,uniapp拍照图片加水印,水印相机功能,手机调起摄像头拍照时自动插入文字、图片动态水印效果,支持水印显示拍摄者当前城市定位、自由调整水印大小和位置,手机拍照时

🏆 前端领域优质创作者 1万+

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | AAAI 2025 | 将 CEM 颜色增强模块引入RT-DETR ,目标检测不再惧怕雾天和低光检测、小目标检测、遥感目标检测高效涨点

本文提出了一种新型结构引导去雾网络(SGDN),通过双色引导桥(BGB)和色彩增强模块(CEM)有效解决雾霾图像去雾问题。BGB利用YCbCr空间的纹理特征引导RGB特征恢复,CEM通过聚合YCbCr通道信息增强RGB色彩感知。实验证明该方法在真实雾霾数据集上优于现有技术,能同时保持色彩准确性和纹理清晰度。文章还提供了完整的代码实现和模型配置指南,包括三种改进版RT-DETR网络结构(rtdetr-l/r18/r50-CEM.yaml),为图像去雾和目标检测任务提供了实用解决方案。

Ai缝合怪、助力小伙伴高效发论文 351

Unity配置安卓环境(详细、简单)

为unity安装和配置安卓打包环境,这里我是以2019版本的unity为例子,其他版本也一样的方式。因为步骤详细,所以内容稍稍有点长,实际只要按照步骤操作是很简单的。安卓环境安装配置有很多办法,大家也可以网上找其他安装配置的教程,这里我是以hub的方式进行安装配置的,这样可以避免很多兼容和报错问题。1、首先我们打开电脑的unityhub查看安装了哪些版本 这里我们看到unity安装了2019.4.19,但是没有配置好安卓环境,我们需要在安装之前修改安装的路径,最好不在C盘 修改好hub的默认安装路径。2、进

小小魔头的BLOG 1万+

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

Unity调用安卓原生退出框

自己常用的安卓退出框,优点是不用在unity里面加个退出界面。打包的话一种方式是可以直接导出安卓工程,在安卓里面写,另一种是自己打成jar包放到Unity项目里面调用,这次我们用第一种方法,话不多说上代码。 先上熟悉的Unity里面调用安卓的代码: public void QuitGame() { AndroidJavaClas...

abc1090275833的博客 1333

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android unity 关闭应用_Unity制作的 安卓和Ios程序如何退出

Android:效果:连按两次手机返回键退出。将下面脚本挂到场景中一个命名为GameQuit的空物体。using UnityEngine;using System.Collections;public class GameQuit : MonoBehaviour {private int mPressTimes = 0;// Use this for initializationvoid Star...

weixin_39552037的博客 1187

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Unity实现安卓单指移动拖拽效果

返回键

weixin_43701019的博客 3014

安卓unity监听程序退出

安卓应用退出时,系统可能直接终止进程,导致Unity的OnApplicationQuit事件无法触发。解决方案是: 放弃依赖退出回调,改为实时保存数据 利用OnApplicationPause作为可靠保存点 在数据变更时立即持久化存储 这样才能应对安卓系统的暴力进程终止机制,确保关键数据不丢失。

qq_38501425的博客 1081

Unity响应Android的返回键,退出当前Activity

一:使用Application.Quit() public void Update() { if(Input.GetKeyDown(KeyCode.Escape)) Application.Quit(); } 如此,Unity 就能响应 Android 的 Back 按钮了。 但是!这个方法存在的问题是,退出当前UnityPlaye...

2673

unity android点击返回键,Unity3D-实现连续点击两次返回键退出游戏(安卓/IOS)

Unity3D-连续点击两次返回键退出游戏本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)1Count Down —— 倒计时在 Update() 中直接调用 EixtDetection()using UnityEngine;/// /// 一个测试倒计时的类/// public class TestCo...

weixin_32506743的博客 1471

Android集成Unity场景

上一篇给大家分享了,但那一篇解决的是Unity采用mono打包,但Unity到了2020及以上版本时,官方都是推荐il2cpp打包,所以这一篇就补上之前那一篇的短板。

Ai1114的博客 1万+

Unity调用安卓安装apk文件教程:Unity与Android无缝对接的利器

Unity调用安卓安装apk文件教程:Unity与Android无缝对接的利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 Unity调用安卓安装apk文件教程是一个开源项目,旨在帮助开发者轻松实现在Unity游戏中调用Android原生API,从而实现从Unity直接安装apk文件的功能。这一功能对于游戏内更新、插件安装等场景至关重要,项目经过严格测试,支持And...

gitblog_06771的博客 634

Unity 实现Android平台打开其他应用程序

/// <summary> /// 安卓平台Unity打开其他应用程序 /// </summary> /// <param name="pkgName">pkgName="com.xxxx.另外一个应用包名"</param> void openPackage(string pkgName) { ...

爱尚游Bin的博客 1915
上一篇: 关于游戏开发,如何开发一款游戏(基于unity)
下一篇: 【安卓开发】【一】初识安卓
HelloCLanguage
博客等级 码龄10年 10粉丝 11原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值