我想要複製其他程序底下的shared_prefs/內的檔案,並複製到一個名為bgyy的檔案, 可是總是報錯? 可否有人幫解決
private void copy()
{

try
{   
Process root = Runtime.getRuntime().exec("su");
    File sd = Environment.getExternalStorageDirectory();
String path=sd.getPath()+"/bgyy"; 
File files=new File(path); 
//files.mkdir(); 


          if (sd.canWrite()) {
         files.mkdir(); 
File file = new File("/data/data/otherpackagename/shared_prefs/CCC.xml");
File fos = new File("/sdcard/bgyy/CCC.xml");
FileInputStream inStream = new FileInputStream(file);
FileOutputStream outStream = new FileOutputStream(fos); 
if(!file.exists()){

// 寫入檔案
int readLen = 0;  
        byte[] buf = new byte[1024];  
        while ((readLen = inStream.read(buf)) != -1) {  
         outStream.write(buf, 0, readLen);  
        }  
        //inStream.flush();  
        inStream.close();  
        outStream.close();  

}
          }
      
}catch(Exception e)
{
e.printStackTrace();
}
07-23 08:07:24.583: W/System.err(29841): java.io.FileNotFoundException: /data/data/otherpackagename/shared_prefs/CCC.xml: open failed: EACCES (Permission denied)
07-23 08:07:24.583: W/System.err(29841):  at libcore.io.IoBridge.open(IoBridge.java:416)
07-23 08:07:24.583: W/System.err(29841):  at java.io.FileInputStream.<init>(FileInputStream.java:78)
07-23 08:07:24.583: W/System.err(29841):  at com.XXX.MainActivity.copyDatabase(MainActivity.java:81)
07-23 08:07:24.583: W/System.err(29841):  at com.XXX.MainActivity.access$0(MainActivity.java:65)
07-23 08:07:24.583: W/System.err(29841):  at com.XXX.MainActivity$1.onClick(MainActivity.java:62)
07-23 08:07:24.583: W/System.err(29841):  at android.view.View.performClick(View.java:4084)
07-23 08:07:24.583: W/System.err(29841):  at android.view.View$PerformClick.run(View.java:16966)
07-23 08:07:24.583: W/System.err(29841):  at android.os.Handler.handleCallback(Handler.java:615)
07-23 08:07:24.583: W/System.err(29841):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-23 08:07:24.583: W/System.err(29841):  at android.os.Looper.loop(Looper.java:137)
07-23 08:07:24.583: W/System.err(29841):  at android.app.ActivityThread.main(ActivityThread.java:4745)
07-23 08:07:24.583: W/System.err(29841):  at java.lang.reflect.Method.invokeNative(Native Method)
07-23 08:07:24.583: W/System.err(29841):  at java.lang.reflect.Method.invoke(Method.java:511)
07-23 08:07:24.583: W/System.err(29841):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
07-23 08:07:24.583: W/System.err(29841):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-23 08:07:24.583: W/System.err(29841):  at dalvik.system.NativeStart.main(Native Method)
07-23 08:07:24.583: W/System.err(29841): Caused by: libcore.io.ErrnoException: open failed: EACCES (Permission denied)
07-23 08:07:24.583: W/System.err(29841):  at libcore.io.Posix.open(Native Method)
07-23 08:07:24.583: W/System.err(29841):  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
07-23 08:07:24.583: W/System.err(29841):  at libcore.io.IoBridge.open(IoBridge.java:400)
07-23 08:07:24.583: W/System.err(29841):  ... 15 more
XMLJava

解决方案 »

  1.   

    请看看是否加了读写SDCARD的权限。
      

  2.   

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.FLASHLIGHT"/>
    <uses-permission android:name="android.permission.READ_OWNER_DATA"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
      

  3.   

    读取其他应用的xml 你需要root权限吧 如果你只是为了获取一些其他应用xml的信息 你可以通过packageInfo 来试试看 
      

  4.   

    请忽略楼上的回答 如果你是为了获取恰应用的sharedPreference 的话 也不是你那种获取方式  // 获取其他应用程序的Context   
                otherContext = createPackageContext("com.jiahui.preferences",   
                        CONTEXT_IGNORE_SECURITY);   
     SharedPreferences preferences = otherContext   
                            .getSharedPreferences("test",   
                                    Context.MODE_WORLD_READABLE);   通过这种方式就可以 达到你获取其他应用的shared_pref下面的xml信息了。前提要那个应用创建的时候不是私有权限data不能通过你那种方式获取 有别的方法
      

  5.   

    我的基本構想是,
    我讀取shared_prefs底下的CCC.XML文件,並複製一份做為資料一
    CCC.XML資料修改後
    在讀取shared_prefs底下的CCC.XML文件,並複製一份做為資料二並可以隨時選取啥時要使用哪一個資料因為我是讀取其他程序的包,所以我已經加入一段程式獲取ROOT~
    我已經獲取ROOT權限了感謝你的熱心回答
      

  6.   

    http://zhidao.baidu.com/question/438099652 看看是否有帮助
      

  7.   

    public abstract File getDir (String name, int mode)Added in API level 1
    Retrieve, creating if needed, a new directory in which the application can place its own custom data files. You can use the returned File object to create and access files in this directory. Note that files created through a File object will only be accessible by your own application; you can only set the mode of the entire directory, not of individual files.Parameters
    name Name of the directory to retrieve. This is a directory that is created as part of your application data.
    mode Operating mode. Use 0 or MODE_PRIVATE for the default operation, MODE_WORLD_READABLE and MODE_WORLD_WRITEABLE to control permissions.
    Returns
    Returns a File object for the requested directory. The directory will have been created if it does not already exist.在android developer 找到的 相关的东西。
      

  8.   

    返回/data/data/youPackageName/下的指定名称的文件夹File对象,如果该文件夹不存在则用指定名称创建一个新的文件夹。
     sorry 占用了这么多楼层 楼主 不要生气哈
      

  9.   

    謝謝呀   我很像得到一些靈感了   請問我可以透過sharedPreference,獲取裡面的所有資料,並在自己的XML 寫入相同的資料,就跟複製是一樣的意思了?只是要如何實作要再想一想  過今天再給分 看還有啥辦法~