2017-03-21 131 views
-2

当我插入sdcard它的工作。从JSON网址下载图片无效。

如何将它保存到我的内部存储器中?

我从Url下载了图片,想在sd卡插入时显示Ok。
但我的三星galaxy S6 edge plus没有Sdcard,所以图像无法下载。我可以将图像保存到内部存储而不是外部存储。

package com.example.makdia.tuntuninews; 

import java.io.BufferedInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.net.URLConnection; 

import android.app.Activity; 
import android.app.Dialog; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class ViewImage extends AppCompatActivity { 


    Button btnShowProgress; 
    String _id; 
    // Progress Dialog 
    private ProgressDialog pDialog; 
    ImageView my_image; 
    // Progress dialog type (0 - for Horizontal progress bar) 
    public static final int progress_bar_type = 0; 
    String _photo; 
    // File url to download 
    public static String file_url; 

    TextView id, name; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_view_image); 

     id = (TextView) findViewById(R.id.photoid); 
     name = (TextView) findViewById(R.id.photoname); 


     _id = getIntent().getStringExtra("MyID"); 
     file_url = getIntent().getStringExtra("MyPhoto"); 
     final String _name = getIntent().getStringExtra("MyName"); 

     id.setText("PhotoID = "+_id); 
     name.setText("PhotoName = "+_name +" "+file_url+ "\n\n"); 


     btnShowProgress = (Button) findViewById(R.id.btnProgressBar); 
     // Image view to show image after downloading 
     my_image = (ImageView) findViewById(R.id.my_image); 
     /** 
     * Show Progress bar click event 
     * */ 
     btnShowProgress.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // starting new Async Task 
       new DownloadFileFromURL().execute(file_url); 
      } 
     }); 



    } 

    /** 
    * Showing Dialog 
    * */ 
    @Override 
    protected Dialog onCreateDialog(int id) { 
     switch (id) { 
      case progress_bar_type: // we set this to 0 
       pDialog = new ProgressDialog(this); 
       pDialog.setMessage("Downloading file. Please wait..."); 
       pDialog.setIndeterminate(false); 
       pDialog.setMax(100); 
       pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
       pDialog.setCancelable(true); 
       pDialog.show(); 
       return pDialog; 
      default: 
       return null; 
     } 
    } 

    /** 
    * Background Async Task to download file 
    * */ 
    class DownloadFileFromURL extends AsyncTask<String, String, String> { 

     /** 
     * Before starting background thread 
     * Show Progress Bar Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      showDialog(progress_bar_type); 
     } 

     /** 
     * Downloading file in background thread 
     * */ 
     @Override 
     protected String doInBackground(String... f_url) { 
      int count; 
      try { 
       URL url = new URL(f_url[0]); 
       URLConnection conection = url.openConnection(); 
       conection.connect(); 
       // this will be useful so that you can show a tipical 0-100% progress bar 
       int lenghtOfFile = conection.getContentLength(); 

       // download the file 
       InputStream input = new BufferedInputStream(url.openStream(), 8192); 

       // Output stream 
       OutputStream output = new FileOutputStream("/sdcard/"+_id+".jpg"); 

       byte data[] = new byte[1024]; 

       long total = 0; 

       while ((count = input.read(data)) != -1) { 
        total += count; 
        // publishing the progress.... 
        // After this onProgressUpdate will be called 
        publishProgress(""+(int)((total*100)/lenghtOfFile)); 

        // writing data to file 
        output.write(data, 0, count); 
       } 

       // flushing output 
       output.flush(); 

       // closing streams 
       output.close(); 
       input.close(); 

      } catch (Exception e) { 
       Log.e("Error: ", e.getMessage()); 
      } 

      return null; 
     } 

     /** 
     * Updating progress bar 
     * */ 
     protected void onProgressUpdate(String... progress) { 
      // setting progress percentage 
      pDialog.setProgress(Integer.parseInt(progress[0])); 
     } 

     /** 
     * After completing background task 
     * Dismiss the progress dialog 
     * **/ 
     @Override 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after the file was downloaded 
      dismissDialog(progress_bar_type); 

      // Displaying downloaded image into image view 
      // Reading image path from sdcard 
      String imagePath = Environment.getExternalStorageDirectory().toString() +"/"+_id+".jpg"; 
      // setting downloaded into image view 
      my_image.setImageDrawable(Drawable.createFromPath(imagePath)); 
     } 

    } 



} 

回答

0

替换:

OutputStream output = new FileOutputStream("/sdcard/"+_id+".jpg"); 

有了:

FileOutputStream outputStream = openFileOutput(_id+".jpg", Context.MODE_PRIVATE); 

注:添加运行时间许可保存文件之前存储。希望这可以帮助。

+0

它不工作兄弟。可能是它的6.0问题。它说的存储/模拟/ 0/11.jpg无法打开访问被拒绝 –

+0

你可以告诉我的堆栈跟踪?你没有添加存储的运行时权限吗? – tahsinRupam

+0

是的,现在你提到它。我添加了运行时权限,现在它的工作:) –