我又加了两行
File sd = new File(Environment.getExternalStorageDirectory().toString());
Log.v("sdfile", sd.canRead() + "canread?");
Log.v("sdfile", sd.canWrite() + "canwrite?");输出结果是
truecanread?
falsecanwrite?震惊啊!!!sd卡只能读不能写啊!!!权限都加了啊!!!到底是为什么啊!!!

解决方案 »

  1.   

    File dir = new File(Environment.getExternalStorageDirectory().getAbslotionPath() + "/micapp");
      

  2.   

    用已经root的真机测试过了,还是不能创建,这是为什么?
      

  3.   

    AndroidManifest.xml里面添加下面一行
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      

  4.   

    你用RE管理器试下,看看能不能创建目录和文件?
    如果也不能创建,那就是你的OS问题了。
      

  5.   


    不管是真机测试还是DDMS下模拟器,都能手动创建文件夹,导入文件之类的,但通过代码就不行
      

  6.   

    这是我bitmaploader的完整代码package com.xiakeng.micapp;import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.ref.SoftReference;
    import java.util.HashMap;import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.widget.ImageView;public class AsyncBitmapLoader {
    /**
     * 内存图片软引用缓冲
     */
    private HashMap<String, SoftReference<Bitmap>> imageCache = null; public AsyncBitmapLoader() {
    imageCache = new HashMap<String, SoftReference<Bitmap>>();
    } public Bitmap loadBitmap(final ImageView imageView, final String imageURL,
    final ImageCallBack imageCallBack) {
    // 在内存缓存中,则返回Bitmap对象
    if (imageCache.containsKey(imageURL)) {
    SoftReference<Bitmap> reference = imageCache.get(imageURL);
    Bitmap bitmap = reference.get();
    if (bitmap != null) {
    Log.v("cache", "notnull");
    return bitmap;
    }
    } else {
    /**
     * 加上一个对本地缓存的查找
     */
    String bitmapName = imageURL
    .substring(imageURL.lastIndexOf("/") + 1);
    File cacheDir = new File(Environment.getExternalStorageDirectory()
    .toString() + "/micapp/");
    File[] cacheFiles = cacheDir.listFiles();
    int i = 0;
    if (null != cacheFiles) {
    for (; i < cacheFiles.length; i++) {
    if (bitmapName.equals(cacheFiles[i].getName())) {
    break;
    }
    } if (i < cacheFiles.length) {
    return BitmapFactory.decodeFile(Environment
    .getExternalStorageDirectory().toString()
    + "/micapp/" + bitmapName);
    }
    }
    } final Handler handler = new Handler() {
    /*
     * (non-Javadoc)
     * 
     * @see android.os.Handler#handleMessage(android.os.Message)
     */
    @Override
    public void handleMessage(Message msg) {
    // TODO Auto-generated method stub
    imageCallBack.imageLoad(imageView, (Bitmap) msg.obj);
    }
    }; // 如果不在内存缓存中,也不在本地(被jvm回收掉),则开启线程下载图片
    new Thread() {
    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
    // TODO Auto-generated method stub
    InputStream bitmapIs = HttpUtils.getStreamFromURL(imageURL); Bitmap bitmap = BitmapFactory.decodeStream(bitmapIs);
    imageCache.put(imageURL, new SoftReference<Bitmap>(bitmap));
    Message msg = handler.obtainMessage(0, bitmap);
    handler.sendMessage(msg); File dir = new File(Environment.getExternalStorageDirectory()
    .toString() + "/micapp");
    File testdir = new File(Environment
    .getExternalStorageDirectory().toString());
    if (!dir.exists()) {
    boolean b = dir.mkdirs();
    Log.v("sdfile", Environment.getExternalStorageState()
    .toString());
    Log.v("sdfile", b + "");
    Log.v("sdfile", testdir.canRead() + "canread?");
    Log.v("sdfile", testdir.canWrite() + "canwrite?");
    Log.v("sdfile", Environment.getExternalStorageState()
    .equals(Environment.MEDIA_MOUNTED) + "写入权限?");
    } File bitmapFile = new File(Environment
    .getExternalStorageDirectory().toString()
    + "/micapp/"
    + imageURL.substring(imageURL.lastIndexOf("/") + 1)); if (!bitmapFile.exists()) {
    try {
    bitmapFile.createNewFile();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    FileOutputStream fos;
    try {
    fos = new FileOutputStream(bitmapFile);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    fos.close();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }.start(); return null;
    } public interface ImageCallBack {
    public void imageLoad(ImageView imageView, Bitmap bitmap);
    }}
      

  7.   


    package com.xiakeng.micapp;import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.ref.SoftReference;
    import java.util.HashMap;import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Environment;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.widget.ImageView;public class AsyncBitmapLoader {
    /**
     * 内存图片软引用缓冲
     */
    private HashMap<String, SoftReference<Bitmap>> imageCache = null; public AsyncBitmapLoader() {
    imageCache = new HashMap<String, SoftReference<Bitmap>>();
    } public Bitmap loadBitmap(final ImageView imageView, final String imageURL,
    final ImageCallBack imageCallBack) {
    // 在内存缓存中,则返回Bitmap对象
    if (imageCache.containsKey(imageURL)) {
    SoftReference<Bitmap> reference = imageCache.get(imageURL);
    Bitmap bitmap = reference.get();
    if (bitmap != null) {
    Log.v("cache", "notnull");
    return bitmap;
    }
    } else {
    /**
     * 加上一个对本地缓存的查找
     */
    String bitmapName = imageURL
    .substring(imageURL.lastIndexOf("/") + 1);
    File cacheDir = new File(Environment.getExternalStorageDirectory()
    .toString() + "/micapp/");
    File[] cacheFiles = cacheDir.listFiles();
    int i = 0;
    if (null != cacheFiles) {
    for (; i < cacheFiles.length; i++) {
    if (bitmapName.equals(cacheFiles[i].getName())) {
    break;
    }
    } if (i < cacheFiles.length) {
    return BitmapFactory.decodeFile(Environment
    .getExternalStorageDirectory().toString()
    + "/micapp/" + bitmapName);
    }
    }
    } final Handler handler = new Handler() {
    /*
     * (non-Javadoc)
     * 
     * @see android.os.Handler#handleMessage(android.os.Message)
     */
    @Override
    public void handleMessage(Message msg) {
    // TODO Auto-generated method stub
    imageCallBack.imageLoad(imageView, (Bitmap) msg.obj);
    }
    }; // 如果不在内存缓存中,也不在本地(被jvm回收掉),则开启线程下载图片
    new Thread() {
    /*
     * (non-Javadoc)
     * 
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
    // TODO Auto-generated method stub
    InputStream bitmapIs = HttpUtils.getStreamFromURL(imageURL); Bitmap bitmap = BitmapFactory.decodeStream(bitmapIs);
    imageCache.put(imageURL, new SoftReference<Bitmap>(bitmap));
    Message msg = handler.obtainMessage(0, bitmap);
    handler.sendMessage(msg); File dir = new File(Environment.getExternalStorageDirectory()
    .toString() + "/micapp");
    File testdir = new File(Environment
    .getExternalStorageDirectory().toString());
    if (!dir.exists()) {
    boolean b = dir.mkdirs();
    Log.v("sdfile", Environment.getExternalStorageState()
    .toString());
    Log.v("sdfile", b + "");
    Log.v("sdfile", testdir.canRead() + "canread?");
    Log.v("sdfile", testdir.canWrite() + "canwrite?");
    Log.v("sdfile", Environment.getExternalStorageState()
    .equals(Environment.MEDIA_MOUNTED) + "写入权限?");
    } File bitmapFile = new File(Environment
    .getExternalStorageDirectory().toString()
    + "/micapp/"
    + imageURL.substring(imageURL.lastIndexOf("/") + 1)); if (!bitmapFile.exists()) {
    try {
    bitmapFile.createNewFile();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    FileOutputStream fos;
    try {
    fos = new FileOutputStream(bitmapFile);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    fos.close();
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }.start(); return null;
    } public interface ImageCallBack {
    public void imageLoad(ImageView imageView, Bitmap bitmap);
    }}
      

  8.   

    更改ADT就好了,可能是模拟器的版本问题,还有就是SD卡大小,太坑了 ,我问题跟你一样,最后一改就成功了!