package com.luck.picture.lib.ui; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.luck.picture.lib.R; import com.luck.picture.lib.model.FunctionConfig; import com.luck.picture.lib.widget.Constant; import com.luck.picture.lib.widget.CustomDialog; import com.yalantis.ucrop.dialog.SweetAlertDialog; import com.yalantis.ucrop.entity.LocalMedia; import com.yalantis.ucrop.util.FileUtils; import com.yalantis.ucrop.util.ScreenUtils; import com.yalantis.ucrop.util.Utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import uk.co.senab.photoview.PhotoViewAttacher; /** * author:luck * project:PictureSelector * package:com.luck.picture.ui * email:邮箱->893855882@qq.com * data:17/01/18 */ public class PictureImagePreviewFragment extends Fragment { public static final String PATH = "path"; private List<LocalMedia> selectImages = new ArrayList<>(); private SweetAlertDialog dialog; private loadDataThread loadDataThread; private boolean isSave; private String directory_path; public static PictureImagePreviewFragment getInstance(String path, boolean isSave, String directory_path, List<LocalMedia> medias) { PictureImagePreviewFragment fragment = new PictureImagePreviewFragment(); Bundle bundle = new Bundle(); bundle.putString(PATH, path); bundle.putBoolean("isSave", isSave); bundle.putString(FunctionConfig.DIRECTORY_PATH, directory_path); bundle.putSerializable(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) medias); fragment.setArguments(bundle); return fragment; } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View contentView = inflater.inflate(R.layout.picture_fragment_image_preview, container, false); final ImageView imageView = (ImageView) contentView.findViewById(R.id.preview_image); final PhotoViewAttacher mAttacher = new PhotoViewAttacher(imageView); selectImages = (List<LocalMedia>) getArguments().getSerializable(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST); final String path = getArguments().getString(PATH); isSave = getArguments().getBoolean("isSave"); directory_path = getArguments().getString(FunctionConfig.DIRECTORY_PATH); if (!isSave && path.startsWith("http")) { showPleaseDialog("请稍候..."); } Glide.with(container.getContext()) .load(path) .asBitmap() .diskCacheStrategy(DiskCacheStrategy.RESULT) .into(new SimpleTarget<Bitmap>(480, 800) { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { imageView.setImageBitmap(resource); mAttacher.update(); dismiss(); } }); mAttacher.setOnViewTapListener(new PhotoViewAttacher.OnViewTapListener() { @Override public void onViewTap(View view, float x, float y) { if (getActivity() instanceof PicturePreviewActivity) { activityFinish(); } else { getActivity().finish(); getActivity().overridePendingTransition(0, R.anim.toast_out); } } }); mAttacher.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // 内部预览不保存 if (!isSave) { if (hasPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { showDownLoadDialog(path); } else { requestPermission(Constant.WRITE_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE); } } return true; } }); return contentView; } protected void activityFinish() { getActivity().setResult(getActivity().RESULT_OK, new Intent().putExtra("type", 1).putExtra(FunctionConfig.EXTRA_PREVIEW_SELECT_LIST, (Serializable) selectImages)); getActivity().finish(); } /** * 下载图片提示 */ private void showDownLoadDialog(final String path) { final CustomDialog dialog = new CustomDialog(getContext(), ScreenUtils.getScreenWidth(getContext()) * 3 / 4, ScreenUtils.getScreenHeight(getContext()) / 4, R.layout.wind_base_dialog_xml, R.style.Theme_dialog); Button btn_cancel = (Button) dialog.findViewById(R.id.btn_cancel); Button btn_commit = (Button) dialog.findViewById(R.id.btn_commit); TextView tv_title = (TextView) dialog.findViewById(R.id.tv_title); TextView tv_content = (TextView) dialog.findViewById(R.id.tv_content); tv_title.setText("提示"); tv_content.setText("是否保存图片至手机?"); btn_cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dialog.dismiss(); } }); btn_commit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showPleaseDialog("请稍候..."); if (!Utils.isNull(path)) { if (path.startsWith("http") || path.startsWith("https")) { loadDataThread = new loadDataThread(path); loadDataThread.start(); } else { // 有可能本地图片 String dirPath = createDir(System.currentTimeMillis() + ".png"); try { FileUtils.copyFile(path, dirPath); Toast.makeText(getActivity(), "图片保存成功至\n" + dirPath, Toast.LENGTH_SHORT).show(); dismiss(); } catch (IOException e) { Toast.makeText(getActivity(), "图片保存失败\n" + e.getMessage(), Toast.LENGTH_SHORT).show(); dismiss(); e.printStackTrace(); } } } dialog.dismiss(); } }); dialog.show(); } // 进度条线程 public class loadDataThread extends Thread { private String path; public loadDataThread(String path) { super(); this.path = path; } public void run() { try { showLoadingImage(path); } catch (Exception e) { e.printStackTrace(); } } } // 下载图片保存至手机 public void showLoadingImage(String urlPath) { try { URL u = new URL(urlPath); String path = createDir(System.currentTimeMillis() + ".png"); byte[] buffer = new byte[1024 * 8]; int read; int ava = 0; long start = System.currentTimeMillis(); BufferedInputStream bin; HttpURLConnection urlConn = (HttpURLConnection) u.openConnection(); double fileLength = (double) urlConn.getContentLength(); bin = new BufferedInputStream(u.openStream()); BufferedOutputStream bout = new BufferedOutputStream( new FileOutputStream(path)); while ((read = bin.read(buffer)) > -1) { bout.write(buffer, 0, read); ava += read; int a = (int) Math.floor((ava / fileLength * 100)); long speed = ava / (System.currentTimeMillis() - start); System.out.println("Download: " + ava + " byte(s)" + " avg speed: " + speed + " (kb/s)"); } bout.flush(); bout.close(); Message message = handler.obtainMessage(); message.what = 200; message.obj = path; handler.sendMessage(message); } catch (IOException e) { Toast.makeText(getActivity(), "图片保存失败\n" + e.getMessage(), Toast.LENGTH_SHORT).show(); e.printStackTrace(); } } /** * 创建文件夹 * * @param filename * @return */ private String createDir(String filename) { String state = Environment.getExternalStorageState(); File rootDir = state.equals(Environment.MEDIA_MOUNTED) ? Environment.getExternalStorageDirectory() : getActivity().getCacheDir(); File path = null; if (!Utils.isNull(directory_path)) { // 自定义保存目录 path = new File(rootDir.getAbsolutePath() + directory_path); } else { path = new File(rootDir.getAbsolutePath() + "/PictureSelector"); } if (!path.exists()) // 若不存在,创建目录,可以在应用启动的时候创建 path.mkdirs(); return path + "/" + filename; } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 200: String path = (String) msg.obj; Toast.makeText(getActivity(), "图片保存成功至\n" + path, Toast.LENGTH_SHORT).show(); dismiss(); break; } } }; /** * 提示框 * * @param msg */ private void showPleaseDialog(String msg) { if (!getActivity().isFinishing()) { dialog = new SweetAlertDialog(getActivity()); dialog.setTitleText(msg); dialog.show(); } } /** * 关闭提示框 */ private void dismiss() { if (dialog != null && dialog.isShowing()) { dialog.cancel(); } } /** * 针对6.0动态请求权限问题 * 判断是否允许此权限 * * @param permissions * @return */ protected boolean hasPermission(String... permissions) { for (String permission : permissions) { if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) { return false; } } return true; } /** * 动态请求权限 * * @param code * @param permissions */ protected void requestPermission(int code, String... permissions) { ActivityCompat.requestPermissions(getActivity(), permissions, code); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case Constant.WRITE_EXTERNAL_STORAGE: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { } else { Toast.makeText(getContext(), "读取内存卡权限已被拒绝", Toast.LENGTH_SHORT).show(); } break; } } @Override public void onDestroy() { super.onDestroy(); if (loadDataThread != null) { handler.removeCallbacks(loadDataThread); loadDataThread = null; } } }