【问题标题】:It can't access the sdcard after setting "android.uid.system" in my application?在我的应用程序中设置“android.uid.system”后无法访问 sdcard?
【发布时间】:2011-07-13 12:38:38
【问题描述】:

这是一个奇怪的问题。如果我没有设置android.uid.system,我的应用程序可以成功访问 SD 卡。但是在设置android.uid.system 之后,我的应用程序无法访问sdcard。这时出现异常:07-13 09:11:24.999: INFO/System.out(9986): create file happen exception--->java.io.IOException: Permission denied。我检查我在正确的地方写了正确的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />. 

因为在我的应用程序中使用了forceStopPackage,所以我需要将android.uid.system 添加到清单中。我在make文件中写了LOCAL_CERTIFICATE := platform。谁能解释这个奇怪的问题。设置android.uid.system后,我的应用程序属于系统进程,应该有更多的权力来访问sdcard。这是我的想法。以下是我的代码:

public void setPackage(String dir){

        System.out.println( "setPackage dir=="+dir  );
        File share=new File("/mnt/sdcard","test.txt");
        if(!share.exists()){
             try{
            share.createNewFile();

        }catch(Exception e){
            System.out.println( "creat file happen exception--->" +e.toString() );
        }
      }
         try{
           if(share!=null){
                System.out.println( "create file is not null"  );
                    FileOutputStream fops=new FileOutputStream(share);

                    fops.write(dir.getBytes());
                    fops.flush();
                    fops.close();
        }
        }catch(Exception e){
                System.out.println( "write Exception-->" +e.toString() );
        }

    }

我的应用程序在模拟器上运行,他的目标版本是 2.3。非常感谢。

【问题讨论】:

    标签: android android-emulator android-manifest


    【解决方案1】:

    请阅读:link1

    还有这个link2

    【讨论】:

    • 最后,我修改了我的代码:access sdcard函数放在一个没有系统用户id的应用程序中,forceStopPackage放在另一个系统用户id的应用程序中。所以这个问题可以解决。谢谢!
    • 虽然这是个问题,但在这里说点什么而不仅仅是提供链接会很有帮助。由于遗留原因,不允许系统用户访问可能可移动的文件系统,因为当文件系统被删除时,所有具有打开文件句柄的进程都必须被杀死。
    【解决方案2】:

    使用Environment.getExternalStorageDirectory().getAbsolutePath() 获取路径,而不是"/mnt/sdcard"

    【讨论】:

    • 问题是不允许系统用户访问可移动文件系统。
    【解决方案3】:

    使用:File share = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),"test.txt");

    这不起作用:File share = new File("/mnt/sdcard", "test.txt");

    【讨论】:

    • 我根据你的建议修改了我的代码,但结果是一样的:它也发生了“权限被拒绝”异常。
    • 确实,这行不通 - 问题是不允许系统用户访问可移动文件系统。
    【解决方案4】:

    可以在android源码中看到:frameworks\base\core\java\android\os\Environment.java,它有一个功能:

    private static void throwIfSystem() {
        if (Process.myUid() == Process.SYSTEM_UID) {
            Log.wtf(TAG, "Static storage paths aren't available from AID_SYSTEM", new Throwable());
        }
    }
    

    此函数将被称为getExternalStorageDirectory(),因此如果您不破解 aosp,具有系统 uid 的应用将无法访问 sdcard。

    【讨论】:

      【解决方案5】:

      android.uid.system 使你的应用程序绑定系统,但系统也观察到sdcard,那么如果你的应用程序删除它,它可以访问sdcard。好像

      在你的xml文件中删除这一行:android:sharedUserId="android.uid.system"ystem

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        相关资源
        最近更新 更多