如题,我先把报错原因粘贴过来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,而且也不是内存不足,因为我用的物理机去做的测试。我不知道有没有人用过系统签名,我的程序在用系统签名签名之前是可以运行的,但是用调用系统签名之后程序就跑不起来了
按道理来说系统拥有最高权限,我调用系统签名也是为了实现静默安装,但是没想到在却提示权限不足。求解,在线等,急!!!!

解决方案 »

  1.   

    加上
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
      

  2.   

    另外看看DownloadCallable.java第114行是什么代码IOException有可能是文件已存在,无法再写,你要看代码里面是如何执行的,一般会判断文件是否存在,存在的话就先删除,删除后再写文件。
      

  3.   


    额额,首先感谢您的回答。
    您第一次回答中提到的两个权限我都已经添加了。
    另外我用的是系统签名,系统签名应该是拥有所有权限把,因为那会我用系统签名写代码,manifest里没添加任何东西也能实现需要权限的功能。
    另外SD卡里没有相同文件名文件啊,好奇怪。。用虚拟机跑也不行第二个回答。
    114行是
      throw new IOException(e.getMessage());



    究竟是因为啥,急死我了。。
      

  4.   

    补充
    我是用这种方式先签名的
    http://jeff-pluto-1874.iteye.com/blog/847366
    上面链接里提到的第二种。。
      

  5.   

    不满你说,还是提示114汗,我都服了
    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/了,但是他路径还是这新鲜了。
      

  6.   

    呵呵,那就说明没弄正确114行是哪行。是DownloadCallable.java这个文件的第114行,你可以用Eclipse可以正确定位114行。或者整个文件完整源码发上来帮你分析。
      

  7.   


    我是重新签名编译出的APK啊,好奇怪,方便QQ聊么371641911.。
      

  8.   

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

  9.   

    删除114行,他报了一个空指针。
    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());
    }
    在上面代码的倒数第二行。。
      

  10.   

    Logger.e("D.E. TRY", e.getMessage());
    这行出错吗?Logger有这种用法吗?
    如果要输出出错信息,把Logger改为Log
      

  11.   

    像这种获取出错信息的
    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() + " ");
     }
      

  12.   

    应该是系统签名的原因吧,系统签名的apk应该是只能跑在目标系统上。就是说如果你手机的系统是个第三方系统,而你用来给apk签名的系统是你自己下的google的代码编的系统,那么你用系统签名的apk估计就只能跑在这个系统上,而不能跑在你手机上,因为跟你的真机系统签名是不一致的。只是我的猜测,没有验证。供参考
      

  13.   


    哦哦,这个我知道,LOGGER是我自己建的类,方便打印的。
    里面封装的方法就是LOG他打印了一个错误信息,直接报这行,信息内容是空指针。
      

  14.   

    我用e.getMessage和用系统的那个打印出的应该是一个东西把?只有一个NullPointException没有更详细的信息了。。
      

  15.   

    e.getMessage()后面加上+" "Logger.e("D.E. TRY", e.getMessage() + " ");
      

  16.   

    我的确是用google签名的。
    您的意思是说我签名出的系统只能在android虚拟机上运行?是这个意思吗?
    但是其他功能貌似没啥问题啊,至少我现在走过的很多方法都没问题,唯独这个下载它告诉我权限不足。。求证。。
      

  17.   


    一样的效果,空指针第一句报错是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)
    求解答。。
      

  18.   

    DownloadCallable.java第111行,并没有报空指针出错,你是在哪看到空指针出错的呢?建议就当前出错的时候的DownloadCallable.java完整源码发上来。
      

  19.   

    源码如下。。
    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());
    } }}
      

  20.   

    贴完整源码,从第一行包名开始,你担心包名泄露你信息,把包名用xxx代替不会。
      

  21.   

    这个就是了,上面就是各种import了。
      

  22.   

    问题补充。。
    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">
      

  23.   

    你看一下sdcard的权限是d---rwxr-x system   sdcard_rw          2012-01-01 08:02 sdcard
    也就是说sdcard的属主root是没有读写权限的,而你再manifest中加入了sharedUserId=android.uid.system后你的程序就有个和system一样的uid了,所以你读写不了sdcard
      

  24.   


    我后来网上调研貌似也是因为这个原因
    那如果我要是想更改sd卡权限,或者说实现在sd卡内进行读写操作,,怎么办呢?