package net.dev123.yibo.service.listener; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; import java.util.Date; import net.dev123.commons.util.FileUtil; import net.dev123.commons.util.StringUtil; import net.dev123.yibo.R; import net.dev123.yibo.YiBoApplication; import net.dev123.yibo.common.Constants; import android.content.Context; import android.media.MediaScannerConnection; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.webkit.MimeTypeMap; import android.widget.Toast; public class ImageViewerSaveClickListener implements OnClickListener { private static final String TAG = ImageViewerSaveClickListener.class.getSimpleName(); private String imagePath; public ImageViewerSaveClickListener(String imagePath) { this.imagePath = imagePath; } @Override public void onClick(View v) { if (StringUtil.isEmpty(imagePath)) { return; } final Context context = v.getContext(); YiBoApplication yibo = (YiBoApplication)context.getApplicationContext(); String imageFolder = yibo.getImageFolder(); if (imageFolder.toLowerCase().startsWith("/sdcard")) { String state = Environment.getExternalStorageState(); if (!state.equals(Environment.MEDIA_MOUNTED)) { String msg = null; if (state.equals(Environment.MEDIA_REMOVED)) { msg = context.getString(R.string.msg_image_save_fail_sdcard_removed); } else if (state.equals(Environment.MEDIA_UNMOUNTED)) { msg = context.getString(R.string.msg_image_save_fail_sdcard_unmounted); } else if (state.equals(Environment.MEDIA_SHARED)) { msg = context.getString(R.string.msg_image_save_fail_sdcard_shared); } Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); return; } } // 如果SD卡已挂载,则保存图片 File image = new File(imagePath); String fileExtension = MimeTypeMap.getFileExtensionFromUrl(imagePath); if (StringUtil.isEmpty(fileExtension)) { if (FileUtil.isGif(image.getAbsolutePath())){ fileExtension = "gif"; } else { fileExtension = "png"; } } final String extension = fileExtension; String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); String destName = Constants.PICTURE_NAME_PREFIX + fileName + "." + extension; final File dest = new File(imageFolder, destName); boolean isSuccess = false; FileChannel inputChannel = null; FileChannel outputChannel = null; try { inputChannel = new FileInputStream(image).getChannel(); outputChannel = new FileOutputStream(dest).getChannel(); inputChannel.transferTo(0, inputChannel.size(), outputChannel); isSuccess = true; } catch (IOException e) { if (Constants.DEBUG) { Log.e(TAG, e.getMessage(), e); } Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show(); } finally { try { if (inputChannel != null) { inputChannel.close(); } if (outputChannel != null) { outputChannel.close(); } } catch (IOException e) { if (Constants.DEBUG) { Log.e(TAG, e.getMessage(), e); } } } if (isSuccess) { final String absolutePath = dest.getAbsolutePath(); new MediaScannerConnectionClient() { MediaScannerConnection mConnection = new MediaScannerConnection(context, this); { mConnection.connect(); } @Override public void onScanCompleted(String path, Uri uri) { mConnection.disconnect(); mConnection = null; } @Override public void onMediaScannerConnected() { String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); mConnection.scanFile(absolutePath, mime); } }; String msg = context.getString(R.string.msg_image_save_success, imageFolder + File.separator + destName); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); } } }