如题,我先把报错原因粘贴过来07-24 03:25:07.898: ERROR/D.E. FILE NOT FOUND(1360): /sdcard/2499_com.mobi.filemanager.activity_142051.apk (Permission denied)
07-24 03:25:07.908: ERROR/D.E. IO(1360): /sdcard/2499_com.mobi.filemanager.activity_142051.apk (Permission denied)
07-24 03:25:07.908: ERROR/D.E. IO(1360): java.io.IOException: /sdcard/2499_com.mobi.filemanager.activity_142051.apk (Permission denied)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.downFile(DownloadCallable.java:114)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.doDownload(DownloadCallable.java:50)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:42)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:1)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.lang.Thread.run(Thread.java:1096)我想把一个APK程序下载到SD卡中,但是出了这个错误。
我在manifest里添加了android.permission.WRITE_EXTERNAL_STORAGE,而且也不是内存不足,因为我用的物理机去做的测试。我不知道有没有人用过系统签名,我的程序在用系统签名签名之前是可以运行的,但是用调用系统签名之后程序就跑不起来了
按道理来说系统拥有最高权限,我调用系统签名也是为了实现静默安装,但是没想到在却提示权限不足。求解,在线等,急!!!!
07-24 03:25:07.908: ERROR/D.E. IO(1360): /sdcard/2499_com.mobi.filemanager.activity_142051.apk (Permission denied)
07-24 03:25:07.908: ERROR/D.E. IO(1360): java.io.IOException: /sdcard/2499_com.mobi.filemanager.activity_142051.apk (Permission denied)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.downFile(DownloadCallable.java:114)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.doDownload(DownloadCallable.java:50)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:42)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:1)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-24 03:25:07.908: ERROR/D.E. IO(1360): at java.lang.Thread.run(Thread.java:1096)我想把一个APK程序下载到SD卡中,但是出了这个错误。
我在manifest里添加了android.permission.WRITE_EXTERNAL_STORAGE,而且也不是内存不足,因为我用的物理机去做的测试。我不知道有没有人用过系统签名,我的程序在用系统签名签名之前是可以运行的,但是用调用系统签名之后程序就跑不起来了
按道理来说系统拥有最高权限,我调用系统签名也是为了实现静默安装,但是没想到在却提示权限不足。求解,在线等,急!!!!
解决方案 »
- android ScrollView 中一个 TextView 显示
- 请问google怎么通过Android挣钱?
- Android开发手机公交可行吗?
- 请教高手,一个关于android系统中录音机的问题?
- 触屏事件的获取
- Android上控制PL2303HX
- 万圣节怎么过才够嗨
- androoid 百度地图api调用时mapview闪动
- 为什么代码放在try中,运行这段代码还是会有运行时错误呢?
- Android 手写涂鸦 画笔 效果
- android编译只能导出用于Linux平台开发的SDK?不能导出用于Windows平台的SDK?那这个SDK有什么用?用了一下不能用到Eclipse中去
- 如何手动更新android SDK?
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
额额,首先感谢您的回答。
您第一次回答中提到的两个权限我都已经添加了。
另外我用的是系统签名,系统签名应该是拥有所有权限把,因为那会我用系统签名写代码,manifest里没添加任何东西也能实现需要权限的功能。
另外SD卡里没有相同文件名文件啊,好奇怪。。用虚拟机跑也不行第二个回答。
114行是
throw new IOException(e.getMessage());
。
。
。
究竟是因为啥,急死我了。。
我是用这种方式先签名的
http://jeff-pluto-1874.iteye.com/blog/847366
上面链接里提到的第二种。。
07-24 05:50:35.679: ERROR/D.E. FILE NOT FOUND(1360): /sdcard/root_12800_20120721.apk (Permission denied)
07-24 05:50:35.689: ERROR/D.E. IO(1360): /sdcard/root_12800_20120721.apk (Permission denied)
07-24 05:50:35.689: ERROR/D.E. IO(1360): java.io.IOException: /sdcard/root_12800_20120721.apk (Permission denied)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.downFile(DownloadCallable.java:114)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.doDownload(DownloadCallable.java:50)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:42)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:1)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-24 05:50:35.689: ERROR/D.E. IO(1360): at java.lang.Thread.run(Thread.java:1096)您看到第一行的那个路径了么,我代码里都改成/sdcard/wandoujia/了,但是他路径还是这新鲜了。
我是重新签名编译出的APK啊,好奇怪,方便QQ聊么371641911.。
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
FutureTask<Integer> task = new FutureTask<Integer>(
new DownloadCallable(path.toString(), url, fileName, fileType));
threadPool.submit(task);
int result = -1;
try {
result = task.get();
Logger.e("DOWNLOAD TRY", "Result from task.get () = " + task.get());
} catch (Exception e) {
Logger.e("D.E. TRY", e.getMessage());
}
在上面代码的倒数第二行。。
这行出错吗?Logger有这种用法吗?
如果要输出出错信息,把Logger改为Log
catch (Exception e) {
Logger.e("D.E. TRY", e.getMessage());
}可以直接用
catch (Exception e) {
e.printStackTrace();
}如果非要用e.getMessage()的话,有可能为空,所以,在e.getMessage()后面加上+" "比较安全。
catch (Exception e) {
Log.e("D.E. TRY", e.getMessage() + " ");
}
哦哦,这个我知道,LOGGER是我自己建的类,方便打印的。
里面封装的方法就是LOG他打印了一个错误信息,直接报这行,信息内容是空指针。
您的意思是说我签名出的系统只能在android虚拟机上运行?是这个意思吗?
但是其他功能貌似没啥问题啊,至少我现在走过的很多方法都没问题,唯独这个下载它告诉我权限不足。。求证。。
一样的效果,空指针第一句报错是FILE NOT FOUND ,后面跟一个权限不足。。我把第一句的try catch去掉了。
打印报错如下07-24 07:36:51.645: ERROR/D.E. IO(453): /sdcard/MDM/Application/root_12800_20120721.apk (Permission denied)
07-24 07:36:51.645: ERROR/D.E. IO(453): java.io.FileNotFoundException: /sdcard/MDM/Application/root_12800_20120721.apk (Permission denied)
07-24 07:36:51.645: ERROR/D.E. IO(453): at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
07-24 07:36:51.645: ERROR/D.E. IO(453): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.io.FileOutputStream.<init>(FileOutputStream.java:168)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.io.FileOutputStream.<init>(FileOutputStream.java:147)
07-24 07:36:51.645: ERROR/D.E. IO(453): at sfa.mobroad.mdm.function.DownloadCallable.downFile(DownloadCallable.java:111)
07-24 07:36:51.645: ERROR/D.E. IO(453): at sfa.mobroad.mdm.function.DownloadCallable.doDownload(DownloadCallable.java:50)
07-24 07:36:51.645: ERROR/D.E. IO(453): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:42)
07-24 07:36:51.645: ERROR/D.E. IO(453): at sfa.mobroad.mdm.function.DownloadCallable.call(DownloadCallable.java:1)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
07-24 07:36:51.645: ERROR/D.E. IO(453): at java.lang.Thread.run(Thread.java:1096)
求解答。。
public class DownloadCallable implements Callable {
private String path;
private String url;
private String fileName;
private String fileType; public DownloadCallable(String path, String url, String filename,
String filetype) {
this.path = path;
this.url = url;
this.fileName = filename;
this.fileType = filetype;
} /*
* (non-Javadoc)
*
* @see java.util.concurrent.Callable#call()
*
* @result: 0: download and notify server successfully 1: download failed;
* 2: download successfully, but failed to notify server 3: can not get task
* by given taskID
*/
public Integer call() {
int result = doDownload();
return result;
} public int doDownload() { try {
Logger.e("D. ", "DO");
downFile(url, path, fileName, fileType);
return 0;
} catch (ClientProtocolException e) {
Logger.ee("D.E. CLIENTPROTOCOL", e.getMessage(), e);
return 1; // download failed
} catch (IOException e) {
Logger.ee("D.E. IO", e.getMessage(), e);
return 1; // download failed
} } // download files according url
public void downFile(String url, String path, String filename,
String filetype) throws IOException { URL myURL = new URL(url);
URLConnection conn = null;
try {
conn = myURL.openConnection();
} catch (IOException e) {
Logger.e("D.E. IO", e.getMessage());
throw new IOException(e.getMessage());
}
if (conn == null) {
Logger.e("D. URL CONNECTION", "NULL");
throw new IOException("can not connect server");
} filename = filename + filetype;
// System.out.println(path + "------------------" + filename);
File file = new File(path + "//" + filename);
// System.out.println(file.toString());
if (file.exists()) { // file exists, do not download
// System.out.println("exist!");
file.delete();
} // System.out.println("not exist!");
try {
conn.connect();
} catch (IOException e) {
Logger.e("D.E. IO", e.getMessage());
throw new IOException(e.getMessage());
}
InputStream is = null;
try {
is = conn.getInputStream();
} catch (UnknownServiceException e) {
Logger.e("D.E. UNKNOW SERVICE", e.getMessage());
throw new IOException(e.getMessage());
}
int fileSize = conn.getContentLength();// get file size
if (fileSize <= 0) {
throw new IOException("can not get file size ");
}
if (is == null) {
throw new IOException("stream is null");
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file.toString());
} catch (FileNotFoundException e) {
Logger.e("D.E. FILE NOT FOUND", e.getMessage());
throw new IOException(e.getMessage());
} byte buf[] = new byte[10240];
do {
int numread = is.read(buf);
Logger.e("NUMREAD", numread + "");
if (numread == -1) {
break;
}
try {
fos.write(buf, 0, numread);
} catch (IOException e) {
Logger.e("D.E. IO", e.getMessage());
throw new IOException(e.getMessage());
}
/*
* try { Thread.sleep(2000); } catch (InterruptedException e) {
* Log.e("EXCEPTION", e.getMessage()); throw new
* IOException(e.getMessage()); }
*/
} while (true);
try {
is.close();
fos.close();
} catch (Exception e) {
Logger.e("D.E. CLOSE", e.getMessage());
throw new IOException(e.getMessage());
} }}
manifest.xml中加上这句后就不行了
android:sharedUserId="android.uid.system" 详细如下。。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="android.uid.system" package="com.android.test"
android:versionCode="1" android:versionName="1.0.0">
也就是说sdcard的属主root是没有读写权限的,而你再manifest中加入了sharedUserId=android.uid.system后你的程序就有个和system一样的uid了,所以你读写不了sdcard
我后来网上调研貌似也是因为这个原因
那如果我要是想更改sd卡权限,或者说实现在sd卡内进行读写操作,,怎么办呢?