首先,抱歉我的英语不好,其次,我有一个"小"问题。 我从StackOverFlow测试了很多代码,但我继续遇到同样的问题。
我试图从网址下载一些图片。我有一个ExpandableListView,我使用一个名为Downloadusers的类来下载有关用户的所有信息。 在本课程中,我获得用户的照片网址,然后使用以下代码下载图片:
private void downloadFile(String url) {
String filepath = null;
try
{
URL nurl = new URL(url);
HttpURLConnection urlConnection = (HttpURLConnection) nurl.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
File SDCardRoot = getExternalFilesDir(null);
String filename = url.substring(url.lastIndexOf('/') + 1);
Log.i("Local filename:",""+filename+" SDCardRoot: "+SDCardRoot.toString());
File file = new File(SDCardRoot,filename);
if(file.createNewFile())
{
file.createNewFile();
}
FileOutputStream fileOutput = new FileOutputStream(file);
InputStream inputStream = urlConnection.getInputStream();
int totalSize = urlConnection.getContentLength();
int downloadedSize = 0;
byte[] buffer = new byte[PHOTO_FILE_MAX_SIZE];
int bufferLength = 0;
while ( (bufferLength = inputStream.read(buffer)) > 0 )
{
fileOutput.write(buffer, 0, bufferLength);
downloadedSize += bufferLength;
Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
}
fileOutput.close();
if(downloadedSize==totalSize) filepath=file.getPath();
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
filepath=null;
e.printStackTrace();
}
Log.i("filepath:"," "+filepath);
}
我还验证了网址是否正确,我已在浏览器中加载。 使用Log.i("文件路径:","" +文件路径);我可以看到文件路径是正确的,所以我认为图像是正确下载但是没有,图像文件是损坏的文件,所以当我将图像加载到我的ImageView时,我有一个NullPointException,因为由于图像损坏,bMap readed为null。
我拥有所有权限:互联网,写入和读取外部存储和手机状态。
我也尝试使用AsyncTask下载图像,但我遇到了同样的问题。
有人知道我的问题是什么? 感谢。
答案 0 :(得分:0)
这是我的下载方法。您将下载图像到SDCARD。您可以通过DDMS Perspective查看是否下载了图像。
public void download(String Url) throws IOException {
URL url = new URL (Url);
InputStream input = url.openStream();
try {
File storagePath = new File(Environment.getExternalStorageDirectory());
OutputStream output = new FileOutputStream (new File(storagePath, 'myImage.jpg'));
try {
byte[] buffer = new byte[2048];
int bytesRead = 0;
while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
output.write(buffer, 0, bytesRead);
}
} finally {
output.close();
}
} finally {
input.close();
}
}
此代码段用于在ImageView中显示下载的图像。
ImageView image = (ImageView) findViewById(R.id.image);
Bitmap bitmap = BitmapFactory.decodeFile(Environment
.getExternalStorageDirectory() + "myImage.jpg");
image.setImageBitmap(bitmap);
答案 1 :(得分:0)
我使用库nostra13 "universal-image-loader-1.9.2.jar"解决了我的问题。我的代码现在是:
// If the user photo exists and is public, download and show it.
if (Utils.connectionAvailable(activity)
&& (photoFileName != null) && !photoFileName.equals("")
&& !photoFileName.equals(Constants.NULL_VALUE)) {
// Create options. Setting caché = true (default = false)
DisplayImageOptions options = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.build();
// Create global configuration and initialize ImageLoader
// with this configuration
ImageLoaderConfiguration config = new ImageLoaderConfiguration
.Builder(activity.getApplicationContext())
.defaultDisplayImageOptions(options)
.build();
ImageLoader.getInstance().init(config);
// Load image, decode it to Bitmap and display Bitmap in ImageView
// (or any other view
// which implements ImageAware interface)
ImageLoader.getInstance().displayImage(photoFileName, image);
}
使用该代码,我可以在caché上加载图像并在我的imageview中显示没有问题。
感谢所有人。
答案 2 :(得分:0)
我遇到了同样的问题,但我能够通过设置
来解决它urlConnection.setDoOutput(false);
它有效,但我不知道为什么。