本雍 2023-04-16 19:37 采纳率: 66.7%
浏览 70
已结题

AndrodiStudio 子模块能单独启动么?

我做U3D的,刚接触AndroidStudio(后面简称AS)。我想在AS上做一个下载网上apk,存放到外部存储公用文件夹下,然后打开的功能;然后打包成aar文件,给Unity用。目前一些功能都实现了,打包aar这里出现了问题。

我的下载逻辑都是写在子模块里面,但是由于子模块没法直接启动,我就从主模块跳转到了子模块来测试。现在在AS上执行能走通,能实现一个创建文件夹下载并打开的功能。现在想将这个功能打包成aar然后提供给Unity使用,问题也就出现在这里 。

我是用真机测试的,手机是安卓10的,api是29。
目前目录是这样的:

img

子模块,我目前的做测试,实现了一个安装apk的功能:

img

Unity如果想使用aar,直接调用Call方法就行。
但是由于安卓10以后,访问外部储存需要用户授权,就是手机会弹出一个框,让你点确定才能授权。逻辑用到了onRequestPermissionsResult 这个方法,它是继承Activity类实现的方法。就是说,必须在AS这边有一个界面才行,(不确定,是不是必须要一个界面)

我现在有一个想法,就是unity那边跳转界面到这AS主模块,然后跳到子模块,再开始执行逻辑。
还有个想法就是全部逻辑都写到AS这边来,界面也在这边做,再弄一个unity的apk执行下载完成的事件,这边做完了启动unity的apk。
但是我感觉两种方案都不好,要是拿授权不需要界面就好了,就能直接调用AS这边的方法。

没做过安卓,我现在比较迷茫,希望有人能帮我解惑,我改怎么做才好呢?

我的AS工程 https://gitee.com/fancaihua/android-response.git

  // 安装APK包
    private void installApk() {

        File file = new File("/storage/emulated/0/CreateParty/Install/DJ_Install.apk");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri uri = FileProvider.getUriForFile(this, "com.fch.loadlib.fileprovider", file);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.setDataAndType(uri, "application/vnd.android.package-archive");
        startActivity(intent);
    }


    public void requestStoragePermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    REQUEST_CODE_STORAGE_PERMISSION);
        } else {
            // 如果系统版本低于 6.0,则默认具有存储权限
            installApk();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 如果用户授予了存储权限,则开始下载 APK 文件
                installApk();
            } else {
                // 如果用户拒绝了存储权限,则提示用户
                Toast.makeText(this, "存储权限被拒绝", Toast.LENGTH_SHORT).show();
            }
        }
    }
  • 写回答

4条回答 默认 最新

  • Leodong. 2023-04-16 19:49
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    子模块是无法单独启动的,因为它们是被包含在主模块中的一部分。如果您想要在Unity中使用您的下载网上apk的功能,最好的方法是将它们放在主模块中,并将主模块打包成aar文件。

    关于访问外部存储需要用户授权的问题,您可以在主模块中添加一个Activity来处理授权请求,这个Activity不需要提供任何UI界面,只需要在onCreate方法中执行授权逻辑即可。在您的子模块中调用这个Activity即可。

    下面是一个示例代码,用于在主模块中添加一个处理授权请求的Activity:

    public class PermissionActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestStoragePermission();
        }
    
        private void requestStoragePermission() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        REQUEST_CODE_STORAGE_PERMISSION);
            } else {
                // 如果系统版本低于 6.0,则默认具有存储权限
                finish();
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    setResult(RESULT_OK);
                } else {
                    setResult(RESULT_CANCELED);
                }
                finish();
            }
        }
    }
    

    在您的子模块中,您可以使用下面的代码来调用这个Activity,处理授权请求:

    Intent intent = new Intent(context, PermissionActivity.class);
    context.startActivityForResult(intent, REQUEST_CODE_STORAGE_PERMISSION);
    

    在主模块中,您需要在AndroidManifest.xml文件中声明这个Activity:

    <activity android:name=".PermissionActivity"
        android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"/>
    

    这样,当您的子模块需要访问外部存储时,它会自动跳转到这个Activity,请求授权。一旦授权成功,子模块就可以继续执行下载逻辑了。

    希望这些信息对您有所帮助!


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 修改了问题 4月16日
  • 创建了问题 4月16日

悬赏问题

  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败