好久没有写东西了。备份下知识吧。免得忘记了 。

首先贴一段代码 --  这个是先生成一个本地的路径,将图片保存到这个文件中,然后扫描下sd卡。让系统相册重新加载下 。缺点就是只能保存到DCIM的文

件夹下边,暂时不知道怎么获取系统相机的路径,网上找了下说了好几个方法。其中有一条就是去读取本地的图片,然后根据一定的规则识别出本地相册的路径

保存下,不过觉得性能不是很好。谁有更好的方法可以提供下。

private class DownloadTask extends AsyncTask {

private Context context;

private String filepath;

public int fileLength = 0;

public DownloadTask(Context context) {

this.context = context;

File cacheDir = new File(ImageLoader.getExternalCacheDir(context).getAbsolutePath() );

if(!cacheDir.exists()) {

cacheDir.mkdirs();

}

// filepath = ImageLoader.getExternalCacheDir(context).getAbsolutePath() + File.separator + "caihongjiayuan.jpg";

filepath = UIUtils.generateDownloadPhotoPath();

}

@SuppressWarnings("resource")

@Override

protected String doInBackground(String... sUrl) {

PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass()

.getName());

wl.acquire();

InputStream input = null;

OutputStream output = null;

HttpURLConnection connection = null;

try {

URL url = new URL(sUrl[0]);

connection = (HttpURLConnection) url.openConnection();

connection.setConnectTimeout(5000);

connection.setReadTimeout(20000);

connection.connect();

// expect HTTP 200 OK, so we don‘t mistakenly save error report

// instead of the file

if (connection.getResponseCode() != HttpURLConnection.HTTP_OK)

return "Server returned HTTP " + connection.getResponseCode() + " "

+ connection.getResponseMessage();

fileLength = connection.getContentLength();

input = connection.getInputStream();

output = new FileOutputStream(filepath);

byte data[] = new byte[4096];

long total = 0;

int count;

while ((count = input.read(data)) != -1) {

// allow canceling with back button

if (isCancelled())

return null;

total += count;

if (fileLength > 0) // only if total length is known

publishProgress((int)total);

output.write(data, 0, count);

}

} catch (Exception e) {

return null;

} finally {

try {

if (output != null)

output.close();

if (input != null)

input.close();

} catch (IOException ignored) {

}

if (connection != null)

connection.disconnect();

wl.release();

}

return filepath;

}

@Override

protected void onProgressUpdate(Integer... values) {

// TODO Auto-generated method stub

super.onProgressUpdate(values);

float progress = (float)values[0]/(float)fileLength;

mProgressInfo.setText(getString(R.string.download_progress_info,StringUtils.getKBUnitString(values[0]),StringUtils.getKBUnitString(fileLength)));

mProgressBar.setProgress((int)(progress * 100));

}

@Override

protected void onPostExecute(String result) {

// TODO Auto-generated method stub

super.onPostExecute(result);

mDownloadView.setVisibility(View.GONE);

if (!TextUtils.isEmpty(result)) {

ImageUtils.scanFile(mCurrentActivity, filepath);

ToastUtils.showLongToast(mCurrentActivity, mCurrentActivity.getString(R.string.tips_img_save_path, filepath));

}else {

ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_faile);

}

//

// Bitmap bitmap = BitmapFactory.decodeFile(filepath);

// boolean flag = ImageUtils.insertImageToAllbum(bitmap, mCurrentActivity);

// if (flag) {

ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_success);

//}else {

//ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_faile);

//}

}

}

参考了下别的文章,找到下边一个方法能解决大部分机型适配的问题,且可以将照片保存到系统相机拍完照的目录下。供大家参考。

private class DownloadTask extends AsyncTask{privateContext context;public int fileLength = 0;privateBitmap bmp;publicDownloadTask(Context context) {this.context =context;

File cacheDir= newFile(ImageLoader.getExternalCacheDir(context).getAbsolutePath() );if(!cacheDir.exists()) {

cacheDir.mkdirs();

}

}

@SuppressWarnings("resource")

@OverrideprotectedBoolean doInBackground(String... sUrl) {

PowerManager pm=(PowerManager) context.getSystemService(Context.POWER_SERVICE);

PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass()

.getName());

wl.acquire();

InputStream input= null;

ByteArrayOutputStream output= null;

HttpURLConnection connection= null;try{

URL url= new URL(sUrl[0]);

connection=(HttpURLConnection) url.openConnection();

connection.setConnectTimeout(5000);

connection.setReadTimeout(20000);

connection.connect();//expect HTTP 200 OK, so we don‘t mistakenly save error report//instead of the file

if (connection.getResponseCode() !=HttpURLConnection.HTTP_OK)return false;

fileLength=connection.getContentLength();

input=connection.getInputStream();

output= newByteArrayOutputStream();byte data[] = new byte[4096];long total = 0;intcount;while ((count = input.read(data)) != -1) {//allow canceling with back button

if(isCancelled())return false;

total+=count;if (fileLength > 0) //only if total length is known

publishProgress((int)total);

output.write(data,0, count);

}

bmp= BitmapFactory.decodeByteArray(output.toByteArray(),0, output.toByteArray().length);return true;

}catch(Exception e) {return false;

}finally{try{if (output != null)

output.close();if (input != null)

input.close();

}catch(IOException ignored) {

}if (connection != null)

connection.disconnect();

wl.release();

}

}

@Overrideprotected voidonProgressUpdate(Integer... values) {//TODO Auto-generated method stub

super.onProgressUpdate(values);float progress = (float)values[0]/(float)fileLength;

mProgressInfo.setText(getString(R.string.download_progress_info,StringUtils.getKBUnitString(values[0]),StringUtils.getKBUnitString(fileLength)));

mProgressBar.setProgress((int)(progress * 100));

}

@Overrideprotected voidonPostExecute(Boolean result) {//TODO Auto-generated method stub

super.onPostExecute(result);

mDownloadView.setVisibility(View.GONE);if (result.booleanValue() &&ImageUtils.insertImageToAllbum(bmp, mCurrentActivity)) {

}else{

ToastUtils.showLongToast(mCurrentActivity, R.string.tips_download_photo_faile);

}

}

}

两个方法的区别就是将FileOutputStream换成了ByteArrayOutputStream项目中主要是有显示下载进度条的需求,所以稍微复杂了点。

另外: ImageUtils 中insertImage 方法如下。

public static boolean insertImageToAllbum(Bitmap bitmap,Context mContext) {

if (bitmap != null) {

String uri = MediaStore.Images.Media.insertImage(mContext.getContentResolver(),bitmap, "", "");

if (!TextUtils.isEmpty(uri)) {

String filePath = getRealPathFromURI(Uri.parse(uri),mContext);

ToastUtils.showLongToast(mContext, mContext.getString(R.string.tips_img_save_path, filePath));

scanFile(mContext,filePath);

return true;

}

}

return false;

}

public static void scanFile(Context mContext,String path){

MediaScannerConnection.scanFile(mContext, new String[] { path }, null,

new MediaScannerConnection.OnScanCompletedListener() {

public void onScanCompleted(String path, Uri uri) {

}

});

}

方法scanFile是让系统重新加载SD卡的 。。

over,有疑问请留言,欢迎指正错误。

原文:http://www.cnblogs.com/gengsy/p/3905023.html

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐