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

囧蜀黍 2013-09-26 11:52:51
想要复制在/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)
...全文
1816 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
奋斗91 2014-12-21
  • 打赏
  • 举报
回复
这个要使用有root权限的progress执行shell命令的。。。
nnnaswa 2013-09-27
  • 打赏
  • 举报
回复
你的data可能是烧写下去的吧
囧蜀黍 2013-09-27
  • 打赏
  • 举报
回复
引用 2 楼 sanyu626 的回复:
copy(String fromFile, String toFile)方法写的有问题,你传入的FROMPATH是一个文件路径,所以root应该是一个文件而不是一个目录,所以要先判断再进行操作!
求具体方法?? (其实我这应用只是想复制其他应用/data/data目录下的文件而已
囧蜀黍 2013-09-27
  • 打赏
  • 举报
回复
引用
APP层没有访问data/data目录下的权限,除非是你自己的
回复2楼,我自己的手机是已经root过了,而且我调试后发现是
 currentFiles = root.listFiles();
出现问题,它的值是null,求解
狂想者 2013-09-27
  • 打赏
  • 举报
回复
copy(String fromFile, String toFile)方法写的有问题,你传入的FROMPATH是一个文件路径,所以root应该是一个文件而不是一个目录,所以要先判断再进行操作!
凉凉二点凉 2013-09-27
  • 打赏
  • 举报
回复
APP层没有访问data/data目录下的权限,除非是你自己的
狂想者 2013-09-27
  • 打赏
  • 举报
回复
如果你想复制目录data/data下的文件,那么你就把路径写成目录:FROMPATH = "data/data/";

80,362

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧