2

URLから画像をダウンロードしてsdcardのフォルダに保存したいです。
フォルダが存在しない場合は、フォルダを作成して保存します。
しかし、次の例外を与えます:

java.io.FileNotFoundException: /mnt/sdcard (Is a directory)
4

6 に答える 6

2

メッセージは明確です。/ mnt / sdcardは、ファイルではなくディレクトリです。ディレクトリ以外のパスに書き込むFileOutputStreamを作成する必要があります。

例えば:

//Setting up cache directory to store the image
File cacheDir=new File(context.getCacheDir(),"cache_folder");

// Check if cache folder exists, otherwise create folder. 
if(!cacheDir.exists())cacheDir.mkdirs();

// Setting up file to write the image to. 
File f=new File(cacheDir, "img.png");

// Open InputStream to download the image. 
InputStream is=new URL(url).openStream();

// Set up OutputStream to write data into image file. 
OutputStream os = new FileOutputStream(f);

HelperUtil.CopyStream(is, os);

...



/**
 * Copy all data from InputStream and write using OutputStream
 * @param is InputStream
 * @param os OutputStream
 */
public static void CopyStream(InputStream is, OutputStream os)
{
    final int buffer_size=1024;
    try
    {
        byte[] bytes=new byte[buffer_size];
        for(;;)
        {
          int count=is.read(bytes, 0, buffer_size);
          if(count==-1)
              break;
          os.write(bytes, 0, count);
        }
    }
    catch(Exception ex){}
}
于 2012-06-27T12:15:08.800 に答える
2

このようなことを試してください

String image_URL="http://chart.apis.google.com/chart?chs=200x200&cht=qr&chl=http%3A%2F%2Fandroid-er.blogspot.com%2F";

String extStorageDirectory;
File file;
Bitmap bm;
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
        file=new File(android.os.Environment.getExternalStorageDirectory(),"Your FolderName");
        extStorageDirectory = Environment.getExternalStorageDirectory().toString();
  }else{
        file=YourActivity.this.getCacheDir();
 }
if(!file.exists())
  file.mkdirs();


  extStorageDirectory+="Your FolderName/yourimagename.PNG";
  File imageFile = new File(extStorageDirectory);

  Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());
  if(bitmap!=null){
  imageview.setImageBitmap(bitmap);
  }else{
    extStorageDirectory = Environment.getExternalStorageDirectory().toString();
    BitmapFactory.Options bmOptions;
    bmOptions = new BitmapFactory.Options();
    bmOptions.inSampleSize = 1;
    bm = LoadImage(image_URL, bmOptions);
    imageview.setImageBitmap(bm);

    OutputStream outStream = null;
    file=new File(android.os.Environment.getExternalStorageDirectory(),"Your FolderName");

    file=new File(extStorageDirectory, "Your FolderName/yourimagename.PNG");
     try {
        outStream = new FileOutputStream(file);
        bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
        outStream.flush();
        outStream.close();



      } catch (FileNotFoundException e) {
         // TODO Auto-generated catch block
       e.printStackTrace();

      } catch (IOException e) {
         // TODO Auto-generated catch block
        e.printStackTrace();

      }
  }

メソッドは次のとおりです

private Bitmap LoadImage(String URL, BitmapFactory.Options options)
 {      
  Bitmap bitmap = null;
  InputStream in = null;      
    try {
      in = OpenHttpConnection(URL);
      bitmap = BitmapFactory.decodeStream(in, null, options);
      in.close();
    } catch (IOException e1) {
   }
  return bitmap;              
}

 private InputStream OpenHttpConnection(String strURL) throws IOException{
    InputStream inputStream = null;
    URL url = new URL(strURL);
    URLConnection conn = url.openConnection();

  try{
   HttpURLConnection httpConn = (HttpURLConnection)conn;
   httpConn.setRequestMethod("GET");
   httpConn.connect();

    if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
       inputStream = httpConn.getInputStream();
      }
  }catch (Exception ex){ 
       Log.e("error",ex.toString());
       }
  return inputStream;
 }
于 2012-06-27T12:24:45.757 に答える
1

これを使って

if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
        File file=new File(Environment.getExternalStorageDirectory()+path);  

        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG,100, bytes);
        byte b[] = bytes.toByteArray();
        try
        {
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(b);
            fos.flush();
            fos.close();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

パスはSDカード内のフォルダになり、bitampは画像のオブジェクトになります

于 2012-06-27T12:27:33.823 に答える
1

画像を保存しようとしているときに間違ったパスを指定しています。「/mnt/sdcard/image.jpg」のようなものにする必要があるのに対し、「/mnt/sdcard」を使用しているようです

于 2012-06-27T12:03:08.627 に答える
1

これを試してみてください。外部メモリが存在する場合はそれを返します。それ以外の場合は、電話のメモリ ディレクトリを返します。コンストラクターは、Context と、作成するフォルダーの名前をパラメーターとして受け取ります。また、このリンクを試してみてください。必要なものについては非常に優れています。画像ローダー

public class FileCache {

private File cacheDir;
private String applicationDirectory = Config.applicationMainFolder;

public FileCache(Context context, String folderName){
    //Find the dir to save cached images
    if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
        cacheDir=new File(context.getExternalFilesDir(null), applicationDirectory + folderName);
    else
        cacheDir = new File(context.getCacheDir(), applicationDirectory + folderName);
    if(!cacheDir.exists())
        cacheDir.mkdirs();
}

public File getFile(String url){
    String filename=String.valueOf(url.hashCode());
    File f = new File(cacheDir, filename);
    return f;
}

public void clear(){
    File[] files=cacheDir.listFiles();
    if(files==null)
        return;
    for(File f:files)
        f.delete();
}
}
于 2012-06-27T12:26:17.833 に答える
1
BitmapFactory.Options bmOptions;
        bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;
        bm = LoadImage(image_url, bmOptions);
        extStorageDirectory = Environment.getExternalStorageDirectory()
                .toString() + "/image_folder";

        OutputStream outStream = null;

        File wallpaperDirectory = new File(extStorageDirectory);
        wallpaperDirectory.mkdirs();
        File outputFile = new File(wallpaperDirectory, "image.PNG");

        try {
            outStream = new FileOutputStream(outputFile);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }


        try {
            bm.compress(Bitmap.CompressFormat.PNG, 100, outStream);
            outStream.flush();
            outStream.close();


        } catch (FileNotFoundException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();
        }
  private Bitmap LoadImage(String URL, BitmapFactory.Options options) {
Bitmap bitmap = null;
InputStream in = null;
try {
    in = OpenHttpConnection(URL);
    bitmap = BitmapFactory.decodeStream(in, null, options);
    in.close();
} catch (IOException e1) {
}
return bitmap;
 }

  private InputStream OpenHttpConnection(String strURL) throws IOException {
InputStream inputStream = null;
URL url = new URL(strURL);
URLConnection conn = url.openConnection();

try {
    HttpURLConnection httpConn = (HttpURLConnection) conn;
    httpConn.setRequestMethod("GET");
    httpConn.connect();

    if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
        inputStream = httpConn.getInputStream();
    }
} catch (Exception ex) {
}
return inputStream;
}
于 2012-06-27T12:17:47.990 に答える