Android app开发中,禁止访问/data/local/tmp

     

       


最近在做一个项目,希望能够将一些预编译好的bin,so等从assert目录中,拷贝到/data/local/tmp目录下面,然后在android app开发中调用

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);

      模拟adb shell命令的执行情况,出现的问题有如下几个:

      1)没有办法创建目录

      2) 没有办法使用chmod

     提示,都是表示权限不够。

    后面在https://stackoverflow.com/questions/23424602/android-permission-denied-for-data-local-tmp中找到了原因。因为在最新的Android版本(我们的是7.0.1),这样做是不允许的。虽然他曾经可以过。

     我这边参考文中给出的方案,把我的所有预编译的东西都拷贝到了getContext().getFilesDir() 。在实际的项目中,这个地址是:/data/data/com.***.***/files.

     而关于文件的拷贝,可以通过OutputStream来实现。

    private void copyBigDataToSD(String strOutFileName) throws IOException {
        Log.i(TAG, "start copy file " + strOutFileName);
        File sdDir =  mActivity.getFilesDir();//获取跟目录
        File file = new File(sdDir.toString()+"/L2Norm/");
        if (!file.exists()) {
            file.mkdir();
        }

        String tmpFile = sdDir.toString()+"/L2Norm/" + strOutFileName;
        File f = new File(tmpFile);
        if (f.exists()) {
            Log.i(TAG, "file exists " + strOutFileName);
            return;
        }
        InputStream myInput;
        java.io.OutputStream myOutput = new FileOutputStream(sdDir.toString()+"/L2Norm/"+ strOutFileName);
        Log.i(TAG, "cpu property " + cpu_abi);
        String input_path = cpu_abi + "/" + strOutFileName;
        Log.i(TAG, "file exists " + input_path);
        myInput = this.mActivity.getAssets().open(input_path);
        byte[] buffer = new byte[1024];
        int length = myInput.read(buffer);
        while (length > 0) {
            myOutput.write(buffer, 0, length);
            length = myInput.read(buffer);
        }
        myOutput.flush();
        myInput.close();
        myOutput.close();
    }

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用,你遇到的问题是创建目录时权限被拒绝。可能原因是你电脑C盘用户下的用户名包含了文或其他字符导致文件路径出现乱码。解决方法如下: 1. 首先,需要在本地创建一个新的用户账户。你可以通过点击桌面左下角的Windows图标找到Windows系统文件夹,在里面找到命令提示符cmd。右击cmd并选择以管理员身份运行。 2. 在cmd命令行输入以下命令:net user administrator /active:yes,然后按回车。这个命令会激活administrator超级管理员账户。 3. 打开控制面板,点击用户账户,然后点击管理其他账户。你会看到一个名为Administrator的本地账户,点击进去设置密码和密码提示。 4. 注销当前用户账户,然后在登录界面点击Administrator账户进行登录。 5. 在登录到新账户后,按下Win+R键,输入regedit并按回车,打开注册表编辑器。 6. 定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList,找到以S-1-5-21开头的两个文件,依次点击进入,然后在右边找到ProfileImagePath,双击并修改为你想要的新用户名(只能是英文),然后点击确定。 7. 关闭注册表编辑器。 8. 在Administrator账户上打开此电脑,进入C盘,找到你原来的用户名文件夹,右键并选择重命名,将其改为和注册表修改的用户名一样。 9. 注销Administrator账户,重新登录你原来的账户,问题就不会再报错了。 根据引用,这个问题的原因是你电脑C盘用户下的用户名包含了文或其他字符,导致在寻找文件时出现乱码从而导致权限被拒绝的错误。 综上所述,你可以按照上述步骤创建一个新的本地用户,并修改相关的文件夹和注册表的用户名,以解决该问题。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [IDEA,debug时出现FileNotFoundException: C:\Users\Àîê»\AppData\Local\Temp\capture83.prop (系统找...](https://blog.csdn.net/weixin_46947293/article/details/122785894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值