大家好,我正在修改2.2平台下Settings里的源码,碰到了点问题,望大家帮忙,问题是这样的在AndroidMenifest.xml中我们可以看到android:sharedUserId="android.uid.system"
但是有了这句后,我就无法对sd卡进行读写操作,比如我丢个test.txt到sd卡下在进行IO操作,是找不到这个文件的
如果我把android:sharedUserId="android.uid.system"注释掉,就可以对test.txt进行IO操作了,也找的到这个文件。
在Settings中android:sharedUserId="android.uid.system"是不可少的,少了它很多Settings下应用直接开不了,或一开就报错。
问下大家,有什么方法在有android:sharedUserId="android.uid.system"的情况下,还能对sd卡进行读写操作吗??

解决方案 »

  1.   


    我在eoe里面悬赏100金币了,希望有高人出现啊
      

  2.   

    setting  不可以写sd卡 就不通过他写
    setting  里面的不都是在setting那个app里
    比如通话设置是在phone里面
    自己写一个程序 放在setting里面显示  但是这个应用没有声明sharedUserId仅供参考,没有实际尝试过~-~
      

  3.   

    我曾今也遇到过这个问题,可以确定当使用了android:sharedUserId="android.uid.system" 签名后,确实会引起无法访问SD卡的问题,解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中.
    我最后的解决方式,在程序外部单独写了一个service,对这个service进行android:sharedUserId="android.uid.system"签名, 应用程序所需的数据都由service获得,然后向外广播,这个方法的确是不太好,希望有更好的办法 
      

  4.   


    不行,我也应用也得有系统权限才行,不然我有些功能实现不了,所以我也必须要有system的sharedUserId
    ...
      

  5.   

    可以解决的关键在于你把android:sharedUserId="android.uid.system"指配给了全局,也就是说,你是这么写的:<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="edu.tsinghua.onekeyalarm.autoupdate"
          android:sharedUserId="android.uid.system"这样意味着你的全部进程都会以system身份在运行。这导致全部的进行都无法对sd卡进行写操作(但是可以读,你可以试试)所以,合理的方式是只指派一个进程以system身份运行,你把需要该权限的操作都用这个进程来完成就行了。比如我让一个Service以system身份运行,让他去给我安装app,那你需要这样定义这个Service:<service android:name="PackageInstallService" 
    android:sharedUserId="android.uid.system">
    </service>不要把android:sharedUserId="android.uid.system"写在整个manifest中。这样,其他的进程,无论是Activity还是Service,都可以不受system权限的影响,可以去写sd卡了。
    把完整的AndroidManifest.xml贴上来吧:
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="edu.tsinghua.autoupdate"
          android:versionCode="1"
          android:versionName="1.0">
          
        <application android:icon="@drawable/icon" android:label="@string/app_name">
            <activity android:name=".AutoUpdate"
                      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 android:name="UpdateService" ></service>
        
    <service android:name="PackageInstallService" 
    android:sharedUserId="android.uid.system">
    </service>

    </application>

    <uses-sdk android:minSdkVersion="8" />

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

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

    </manifest> 
      

  6.   

    丫 顶酒楼 写的太好了 我也遇到了同样的问题 就是把android:sharedUserId="android.uid.system"指配给了全局,导致无法在sdcard上创建文件,郁闷了老半天了, 现在 重要明个喽 多谢多谢啊  真是踏破铁鞋无觅处 得来就在csdn论坛哦 O(∩_∩)O~
      

  7.   


    非常感谢,可能是我没说清楚,你的方法是剥离,是肯定可以的。
    但是我想要的是我的应用既是android.uid.system级的,又可以读写sd卡,因为我自身的应用中有些方面也要用到android.uid.system才能用的权限。现在我解决了 我修改了  Volumn.cpp里面关于SD卡的一些东西.
      

  8.   

    good,九楼的解决了我编译的问题。
      

  9.   


    9楼mentats,你在manifest里把system权限加给了service,可是这个service的貌似并没有拿到system权限。
    我如果加到全局的话,只需要再用signapk.jar给这个apk重新弄个签名就好,如果只加给service的话,有什么额外操作吗?谢谢
      

  10.   

    vold 模块里的 Volume.cpp文件doMount(devicePath, path, false, false, false,1000, 1015, 0702, true)doMount(devicePath, path, false, true, false,1000, 1015, 0002, true)
      

  11.   


    用了九楼的方法,可是service并没有拿到system权限,是否还有其他的操作?