2017-02-22 8 views
0

У меня есть приложение, которому необходимо загрузить некоторые сгенерированные изображения (PNG).сохранение загруженного файла во внутреннюю память java/android не удается

Я пробовал стандартный подход ImageDownloader extends AsyncTask, doInBackground() извлекает изображение, а onPostExecute() попытается сохранить его на внутреннем изображении.

(Часть) код ниже:

public class HandleImages extends AppCompatActivity { 
String filename = ""; 

public boolean saveImageToInternalStorage(Bitmap image) { 
    try { 
     FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); 

     image.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     fos.close(); 

     return true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 

public Bitmap retrieveImage(String url){ 
    ImageDownloader task = new ImageDownloader(); 
    Bitmap image = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); 

    try { 
     image = task.execute(url).get(); 
    } catch (InterruptedException e) { 
     MainActivity.debb("InterruptedException - " + e.getMessage() + " in " + new Object(){}.getClass().getEnclosingMethod().getName()); 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     MainActivity.debb("ExecutionException - " + e.getMessage() + " in " + new Object(){}.getClass().getEnclosingMethod().getName()); 
     e.printStackTrace(); 
    } 
    return image; 
} 


public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 
    @Override 
    protected Bitmap doInBackground(String... urls) { 
     try { 
      String[] filenames = urls[0].split("/"); 
      filename = filenames[filenames.length-1] + ".jpg"; 

      URL url = new URL(urls[0]); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

      connection.connect(); 
      InputStream inputStream = connection.getInputStream(); 

      return BitmapFactory.decodeStream(inputStream); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     super.onPostExecute(bitmap); 
     if (bitmap != null) 
      saveImageToInternalStorage(bitmap); 
    } 
} 
} 

и ошибка, что я получаю: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference.

Кажется, что FileOutputStream fos = openFileOutput(..) терпит неудачу, но понятия не имею, почему.

Также попытался добавить путь к файлу (sdCard.getPath() + "/" +). Как и ожидалось, это не имело никакого значения.

Изображения в порядке, я могу видеть их в браузере. Также попробовали с загруженными изображениями - вместо сгенерированных, тот же результат.

Это довольно странно, есть ли у кого-нибудь идеи?

Спасибо!

ответ

0
private String saveToInternalStorage(Bitmap bitmapImage){ 
     ContextWrapper cw = new ContextWrapper(getApplicationContext()); 
     // path to /data/data/yourapp/app_data/imageDir 
     File directory = cw.getDir("imageDir", Context.MODE_PRIVATE); 
     // Create imageDir 
     File mypath=new File(directory,"profile.jpg"); 

     FileOutputStream fos = null; 
     try {   
      fos = new FileOutputStream(mypath); 
     // Use the compress method on the BitMap object to write image to the OutputStream 
      bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos); 
     } catch (Exception e) { 
       e.printStackTrace(); 
     } finally { 
      try { 
       fos.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return directory.getAbsolutePath(); 
    } 

Надеюсь, эта функция поможет вам. Если вы не можете ответить на вопросы

Смежные вопросы