当前位置:编程学习 > wap >>

关于安卓复制/data/data文件的问题

想要复制在/data/data目录下的某个文件,却出现错误,原代码如下:
package com.jiong.copyma;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

private Button m_btn1;
private final static String FROMPATH = "data/data/com.square_enix.ss/files/dt.txt";
private final static String TOPATH = "data/data/com.square_enix.ss/";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
upgradeRootPermission(getPackageCodePath());
m_btn1 = (Button) findViewById(R.id.account1);
// m_btn2 = (Button)findViewById(R.id.account2);
m_btn1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Log.e("11", "3333333");
if (copy(FROMPATH, TOPATH) == 0) {
Toast.makeText(MainActivity.this, "文件拷贝成功!!!", 20000)
.show();

} else {
Toast.makeText(MainActivity.this, "文件拷贝失败!!!", 20000)
.show();
}
}

});
}

public static boolean upgradeRootPermission(String pkgCodePath) { 
    Process process = null; 
    DataOutputStream os = null; 
    try { 
        String cmd="chmod 777 " + "data/data/com.square_enix.ss/files/dt.txt"; 
        process = Runtime.getRuntime().exec("su"); //切换到root帐号 
        os = new DataOutputStream(process.getOutputStream()); 
        os.writeBytes(cmd + "\n"); 
        os.writeBytes("exit\n"); 
        os.flush(); 
        process.waitFor(); 
    } catch (Exception e) { 
        return false; 
    } finally { 
        try { 
            if (os != null) { 
                os.close(); 
            } 
            process.destroy(); 
        } catch (Exception e) { 
        } 
    } 
    return true; 


 public int copy(String fromFile, String toFile)
    {
        //要复制的文件目录
        File[] currentFiles;
        File root = new File(fromFile);
        //如同判断SD卡是否存在或者文件是否存在
        //如果不存在则 return出去
        if(!root.exists())
        {
            return -1;
        }
        //如果存在则获取当前目录下的全部文件 填充数组
        currentFiles = root.listFiles();
         
        //目标目录
        File targetDir = new File(toFile);
        //创建目录
        if(!targetDir.exists())
        {
            targetDir.mkdirs();
        }
        //遍历要复制该目录下的全部文件
        for(int i= 0;i<currentFiles.length;i++)
        {
            if(currentFiles[i].isDirectory())//如果当前项为子目录 进行递归
            {
                copy(currentFiles[i].getPath() + "/", toFile + currentFiles[i].getName() + "/");
                 
            }else//如果当前项为文件则进行文件拷贝
            {
                CopyFile(currentFiles[i].getPath(), toFile + currentFiles[i].getName());
            }
        }
        return 0;
    }
     

// 文件拷贝
// 要复制的目录下的所有非子目录(文件夹)文件拷贝
public int CopyFile(String fromFile, String toFile) {


Log.e("11", "22222");
//File in = new File(fromFile);
//File out = new File(toFile);
Log.e("11", "555555");
try {
Log.e("11", "6666666");
//FileInputStream fosfrom = new FileInputStream(in);
//FileOutputStream fosto = new FileOutputStream(out);
InputStream fosfrom = new FileInputStream(fromFile);
OutputStream fosto = new FileOutputStream(toFile);
byte bt[] = new byte[1024];
Log.e("11", "44444");
int c;
while ((c = fosfrom.read(bt)) > 0) {
fosto.write(bt, 0, c);
}
fosfrom.close();
fosto.close();
return 0;

} catch (Exception ex) {
ex.printStackTrace();
return -1;
}

}

}


错误提示:
09-26 23:44:09.520: E/11(11363): 3333333
09-26 23:44:09.520: E/AndroidRuntime(11363): FATAL EXCEPTION: main
09-26 23:44:09.520: E/AndroidRuntime(11363): java.lang.NullPointerException
09-26 23:44:09.520: E/AndroidRuntime(11363):  at com.jiong.copyma.MainActivity.copy(MainActivity.java:103)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at com.jiong.copyma.MainActivity$1.onClick(MainActivity.java:43)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at android.view.View.performClick(View.java:4171)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at android.view.View$PerformClick.run(View.java:17070)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at android.os.Handler.handleCallback(Handler.java:615)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at android.os.Handler.dispatchMessage(Handler.java:92)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at android.os.Looper.loop(Looper.java:137)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at android.app.ActivityThread.main(ActivityThread.java:4797)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at java.lang.reflect.Method.invokeNative(Native Method)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at java.lang.reflect.Method.invoke(Method.java:511)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
09-26 23:44:09.520: E/AndroidRuntime(11363):  at dalvik.system.NativeStart.main(Native Method)
--------------------编程问答-------------------- APP层没有访问data/data目录下的权限,除非是你自己的 --------------------编程问答--------------------  copy(String fromFile, String toFile)方法写的有问题,你传入的FROMPATH是一个文件路径,所以root应该是一个文件而不是一个目录,所以要先判断再进行操作! --------------------编程问答--------------------
引用
APP层没有访问data/data目录下的权限,除非是你自己的

回复2楼,我自己的手机是已经root过了,而且我调试后发现是
 currentFiles = root.listFiles();

出现问题,它的值是null,求解 --------------------编程问答--------------------
引用 2 楼 sanyu626 的回复:
 copy(String fromFile, String toFile)方法写的有问题,你传入的FROMPATH是一个文件路径,所以root应该是一个文件而不是一个目录,所以要先判断再进行操作!

求具体方法??
(其实我这应用只是想复制其他应用/data/data目录下的文件而已) --------------------编程问答-------------------- 你的data可能是烧写下去的吧 --------------------编程问答-------------------- 如果你想复制目录data/data下的文件,那么你就把路径写成目录:FROMPATH = "data/data/";
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,