2011-05-04 13 views
5

Ładowanie obrazu z adresu URL przy kliknięciu przycisku i zapisanie go jako bitmapy. Teraz chcę wiedzieć, jak zapisać ten pobrany obraz na kartę SD, jak również w systemie.Android - Zapisywanie pobranego obrazu z adresu URL na karcie SD

próbowałem to zrobić w następujący sposób:

package com.v3.thread.fetchImage; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class MainThreadActivity extends Activity { 
    ImageView imView; 
    EditText ed1; 
    Bitmap bmImg; 
    Button bt, btSave; 
    String imageUrl = ""; 
    int visibilty = 0; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     ed1 = (EditText) findViewById(R.id.edURL); 
     btSave = (Button) findViewById(R.id.btnSave); 

     bt = (Button) findViewById(R.id.btnLoad); 
     bt.setOnClickListener(getImgListener); 

     imView = (ImageView) findViewById(R.id.imview); 
     Log.i("img already downloaded", "img"); 
     btSave.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
       Log.i("img url", "Under Save"); 
       saveImage(); 
      } 
     }); 
    } 

    View.OnClickListener getImgListener = new View.OnClickListener() { 

     public void onClick(View view) { 
      // TODO Auto-generated method stub 
      imageUrl = ed1.getText().toString(); 
      if (imageUrl.equals("")) 

       Toast.makeText(getApplicationContext(), "Enter an URL first", 1000).show();  
downloadFile(imageUrl); 
      Log.i("im url", imageUrl); 
      btSave.setVisibility(visibilty); 
     } 

    }; 

    void downloadFile(String fileUrl) { 
     URL myFileUrl = null; 
     try { 
      myFileUrl = new URL(fileUrl); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      HttpURLConnection conn = (HttpURLConnection) myFileUrl 
        .openConnection(); 
      conn.setDoInput(true); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      Log.i("im connected", "Download"); 
      bmImg = BitmapFactory.decodeStream(is); 

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

    void saveImage() { 
     File filename; 
     try { 
      String path = Environment.getExternalStorageDirectory().toString(); 
      Log.i("in save()", "after mkdir"); 
      new File(path + "/mvc/mvc").mkdir(); 
      filename = new File(path + "/mvc/mvc/var3.jpg"); 
      Log.i("in save()", "after file"); 
      FileOutputStream out = new FileOutputStream(filename); 
      Log.i("in save()", "after outputstream"); 
      bmImg.compress(Bitmap.CompressFormat.JPEG, 90, out); 
      out.flush(); 
      out.close(); 
      Log.i("in save()", "after outputstream closed"); 
      MediaStore.Images.Media.insertImage(getContentResolver(), 
        filename.getAbsolutePath(), filename.getName(), 
        filename.getName()); 
      bt.setText("Saved..."); 
      Toast.makeText(getApplicationContext(), 
        "File is Saved in " + filename, 1000).show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

Ładowanie obrazu z URL działa, ale kiedy nacisnąć przycisk Zapisz, aby go uratować, to zgłasza wyjątek

java .io.FileNotFoundException: /mnt/sdcard/mvc/mvc/var3.image(No takiego pliku lub katalogu)

Więc jak mam zapisać obraz do Karta SD poprawnie?

+0

Jaka jest różnica między "systemem" a "telefonem"? –

+0

Masz pozwolenie na manifest karty SD? – Blundell

Odpowiedz

3

Najpierw musisz utworzyć katalogi i podkatalogi, w których chcesz utworzyć pliki. Widzę, że użyłeś metody mkdir(). Wypróbuj mkdirs() i powinno działać.

0

Dodaj WRITE_EXTERNAL_STORAGE android pozwolenie w manifeście:

Następnie

BitmapDrawable drawable = (BitmapDrawable) mImageView.getDrawable(); 
Bitmap bitmap = drawable.getBitmap(); 

dostać się do katalogu (obiekt File) z kartą SD, takich jak:

File sdCardDirectory = Environment.getExternalStorageDirectory(); 

Utwórz plik specyficzny dla przechowywanie obrazu:

File image = new File(sdCardDirectory, "download.png"); 

Następnie,

boolean success = false; 

// Encode the file as a PNG image. 
FileOutputStream outStream; 
try { 

    outStream = new FileOutputStream(image); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream); 
    /* 100 to keep full quality of the image */ 

    outStream.flush(); 
    outStream.close(); 
    success = true; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

if (success) { 
    //Display Downloaded 
} else { 
    // display Error in Downloading 
} 
Powiązane problemy