GridImageAdapter.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. package com.fxy.adapter;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.pm.PackageManager;
  7. import android.graphics.drawable.Drawable;
  8. import android.os.Environment;
  9. import android.support.v4.app.ActivityCompat;
  10. import android.support.v4.content.ContextCompat;
  11. import android.support.v7.widget.RecyclerView;
  12. import android.util.Log;
  13. import android.view.Gravity;
  14. import android.view.LayoutInflater;
  15. import android.view.MotionEvent;
  16. import android.view.View;
  17. import android.view.ViewGroup;
  18. import android.widget.ImageView;
  19. import android.widget.LinearLayout;
  20. import android.widget.ProgressBar;
  21. import android.widget.TextView;
  22. import android.widget.Toast;
  23. import com.bumptech.glide.Glide;
  24. import com.bumptech.glide.load.engine.DiskCacheStrategy;
  25. import com.bumptech.glide.request.RequestOptions;
  26. import com.elvishew.xlog.XLog;
  27. import com.fxy.common.AudioRecoderDialog;
  28. import com.fxy.utils.AudioRecoderUtils;
  29. import com.fxy.workOrder.WorkOrderOptMainActivity;
  30. import com.luck.picture.lib.config.PictureConfig;
  31. import com.luck.picture.lib.config.PictureMimeType;
  32. import com.luck.picture.lib.entity.LocalMedia;
  33. import com.luck.picture.lib.tools.DateUtils;
  34. import com.luck.picture.lib.tools.StringUtils;
  35. import com.fxy.R;
  36. import java.io.File;
  37. import java.io.Serializable;
  38. import java.util.ArrayList;
  39. import java.util.List;
  40. import java.util.UUID;
  41. import es.dmoral.toasty.Toasty;
  42. /**
  43. * author:luck
  44. * project:PictureSelector
  45. * package:com.luck.pictureselector.adapter
  46. * email:893855882@qq.com
  47. * data:16/7/27
  48. */
  49. public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.ViewHolder> {
  50. public static final int TYPE_CAMERA = 1;
  51. public static final int TYPE_PICTURE = 2;
  52. private LayoutInflater mInflater;
  53. private List<LocalMedia> list = new ArrayList<>();
  54. //已上传
  55. private ArrayList<String> ossPhotoList =new ArrayList<>();
  56. private int selectMax = 9;
  57. private Context context;
  58. private Activity mActivity;
  59. private int pictureType;
  60. //录音参数 start
  61. public static final int RECORD_AUDIO = 1024;
  62. private long downT;
  63. private AudioRecoderDialog recoderDialog;
  64. private AudioRecoderUtils recoderUtils;
  65. private List<LocalMedia> medias = new ArrayList<>();
  66. //录音参数 end
  67. /**
  68. * 点击添加图片跳转
  69. */
  70. private onAddPicClickListener mOnAddPicClickListener;
  71. public interface onAddPicClickListener {
  72. void onAddPicClick();
  73. }
  74. public GridImageAdapter(Context context,Activity activity, onAddPicClickListener mOnAddPicClickListener,int pictureType) {
  75. this.context = context;
  76. this.mActivity = activity;
  77. mInflater = LayoutInflater.from(context);
  78. this.mOnAddPicClickListener = mOnAddPicClickListener;
  79. this.pictureType = pictureType;
  80. }
  81. public void setSelectMax(int selectMax) {
  82. this.selectMax = selectMax;
  83. }
  84. public void setList(List<LocalMedia> list) {
  85. this.list = list;
  86. }
  87. public class ViewHolder extends RecyclerView.ViewHolder {
  88. ImageView mImg;
  89. LinearLayout ll_del;
  90. TextView tv_duration;
  91. ProgressBar progressBar;
  92. ViewHolder(View view) {
  93. super(view);
  94. mImg = view.findViewById(R.id.fiv);
  95. ll_del = view.findViewById(R.id.ll_del);
  96. tv_duration = view.findViewById(R.id.tv_duration);
  97. progressBar = view.findViewById(R.id.progressBar);
  98. }
  99. }
  100. @Override
  101. public int getItemCount() {
  102. if (list.size() < selectMax) {
  103. return list.size() + 1;
  104. } else {
  105. return list.size();
  106. }
  107. }
  108. @Override
  109. public int getItemViewType(int position) {
  110. if (isShowAddItem(position)) {
  111. return TYPE_CAMERA;
  112. } else {
  113. return TYPE_PICTURE;
  114. }
  115. }
  116. /**
  117. * 创建ViewHolder
  118. */
  119. @Override
  120. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  121. View view = mInflater.inflate(R.layout.item_filter_image, viewGroup, false);
  122. return new ViewHolder(view);
  123. }
  124. private boolean isShowAddItem(int position) {
  125. int size = list.size();
  126. return position == size;
  127. }
  128. /**
  129. * 设置值
  130. */
  131. @Override
  132. public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
  133. //少于8张,显示继续添加的图标
  134. if (getItemViewType(position) == TYPE_CAMERA) {
  135. viewHolder.ll_del.setVisibility(View.INVISIBLE);
  136. if (pictureType==PictureConfig.TYPE_AUDIO){
  137. viewHolder.mImg.setImageResource(R.drawable.recod_start_f01);
  138. intAudioView(viewHolder);//
  139. }else{
  140. viewHolder.mImg.setImageResource(R.drawable.ic_add_img);
  141. viewHolder.mImg.setOnClickListener(new View.OnClickListener() {
  142. @Override
  143. public void onClick(View v) {
  144. mOnAddPicClickListener.onAddPicClick();
  145. }
  146. });
  147. }
  148. } else {
  149. viewHolder.ll_del.setVisibility(View.VISIBLE);
  150. viewHolder.ll_del.setOnClickListener(new View.OnClickListener() {
  151. @Override
  152. public void onClick(View view) {
  153. int index = viewHolder.getAdapterPosition();
  154. // 这里有时会返回-1造成数据下标越界,具体可参考getAdapterPosition()源码,
  155. // 通过源码分析应该是bindViewHolder()暂未绘制完成导致,知道原因的也可联系我~感谢
  156. if (index != RecyclerView.NO_POSITION) {
  157. list.remove(index);
  158. ossPhotoList.remove(index);//删除oss
  159. notifyItemRemoved(index);
  160. notifyItemRangeChanged(index, list.size());
  161. Log.i("delete position:", index + "--->remove after:" + list.size());
  162. }
  163. }
  164. });
  165. LocalMedia media = list.get(position);
  166. int mimeType = media.getMimeType();
  167. String path;
  168. if (media.isCut() && !media.isCompressed()) {
  169. // 裁剪过
  170. path = media.getCutPath();
  171. } else if (media.isCompressed() || (media.isCut() && media.isCompressed())) {
  172. // 压缩过,或者裁剪同时压缩过,以最终压缩过图片为准
  173. path = media.getCompressPath();
  174. } else {
  175. // 原图
  176. path = media.getPath();
  177. }
  178. // 图片
  179. if (media.isCompressed()) {
  180. Log.i("compress image result:", new File(media.getCompressPath()).length() / 1024 + "k");
  181. Log.i("压缩地址::", media.getCompressPath());
  182. }
  183. Log.i("原图地址::", media.getPath());
  184. int pictureType = PictureMimeType.isPictureType(media.getPictureType());
  185. if (media.isCut()) {
  186. Log.i("裁剪地址::", media.getCutPath());
  187. }
  188. long duration = media.getDuration();
  189. viewHolder.tv_duration.setVisibility(pictureType == PictureConfig.TYPE_VIDEO
  190. ? View.VISIBLE : View.GONE);
  191. if (mimeType == PictureMimeType.ofAudio()) {
  192. viewHolder.tv_duration.setVisibility(View.VISIBLE);
  193. Drawable drawable = ContextCompat.getDrawable(context, R.drawable.picture_audio);
  194. StringUtils.modifyTextViewDrawable(viewHolder.tv_duration, drawable, 0);
  195. } else {
  196. Drawable drawable = ContextCompat.getDrawable(context, R.drawable.video_icon);
  197. StringUtils.modifyTextViewDrawable(viewHolder.tv_duration, drawable, 0);
  198. }
  199. viewHolder.tv_duration.setText(DateUtils.timeParse(duration));
  200. if (mimeType == PictureMimeType.ofAudio()) {
  201. viewHolder.mImg.setImageResource(R.drawable.audio_placeholder);
  202. } else {
  203. RequestOptions options = new RequestOptions()
  204. .centerCrop()
  205. .placeholder(R.color.color_f6)
  206. .diskCacheStrategy(DiskCacheStrategy.ALL);
  207. Glide.with(viewHolder.itemView.getContext())
  208. .load(path)
  209. .apply(options)
  210. .into(viewHolder.mImg);
  211. }
  212. //itemView 的点击事件
  213. if (mItemClickListener != null) {
  214. viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
  215. @Override
  216. public void onClick(View v) {
  217. int adapterPosition = viewHolder.getAdapterPosition();
  218. mItemClickListener.onItemClick(adapterPosition, v);
  219. }
  220. });
  221. }
  222. }
  223. }
  224. private OnItemClickListener mItemClickListener;
  225. public interface OnItemClickListener {
  226. void onItemClick(int position, View v);
  227. }
  228. public void setOnItemClickListener(OnItemClickListener listener) {
  229. this.mItemClickListener = listener;
  230. }
  231. public void setPhotoPath(String photoPath) {
  232. ossPhotoList.add(photoPath);
  233. }
  234. public ArrayList<String> getPhotoList(){
  235. return ossPhotoList;
  236. }
  237. @SuppressLint("ClickableViewAccessibility")
  238. //初始化录音按钮
  239. private void intAudioView(ViewHolder viewHolder){
  240. recoderDialog = new AudioRecoderDialog(context);
  241. recoderDialog.setOnCallbackListener(new AudioRecoderDialog.CallbackListener() {
  242. @Override
  243. public void closeResult() {
  244. stopRecord();
  245. }
  246. });
  247. viewHolder.mImg.setOnTouchListener(new View.OnTouchListener() {
  248. @Override
  249. public boolean onTouch(View view, MotionEvent event) {
  250. switch(event.getAction()) {
  251. case MotionEvent.ACTION_DOWN:
  252. //⑧申请录制音频的动态权限
  253. if(ContextCompat.checkSelfPermission(context, android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED){
  254. ActivityCompat.requestPermissions(mActivity,new String[]{android.Manifest.permission.RECORD_AUDIO},RECORD_AUDIO);
  255. }else {
  256. startRecord(view);
  257. }
  258. return true;
  259. case MotionEvent.ACTION_UP:
  260. stopRecord();
  261. return true;
  262. }
  263. return false;
  264. }
  265. });
  266. }
  267. private void startRecord(View view){
  268. recoderDialog.showAtLocation(view, Gravity.CENTER, 0, 0);
  269. recoderDialog.setShowAlpha(0.58f);
  270. String fileName = UUID.randomUUID().toString() + ".amr";
  271. String pathName = Environment.getExternalStorageDirectory() + "/"+fileName;
  272. recoderUtils = new AudioRecoderUtils(new File(pathName));
  273. recoderUtils.setOnAudioStatusUpdateListener(new AudioRecoderUtils.OnAudioStatusUpdateListener() {
  274. @Override
  275. public void onUpdate(double db) {
  276. if(null != recoderDialog) {
  277. int level = (int) db;
  278. recoderDialog.setLevel((int)db);
  279. recoderDialog.setTime(System.currentTimeMillis() - downT);
  280. }
  281. }
  282. });
  283. recoderUtils.startRecord();
  284. downT = System.currentTimeMillis();
  285. }
  286. private void stopRecord(){
  287. long diff = recoderUtils.stopRecord();
  288. recoderDialog.close();
  289. XLog.e( "录音存储到了"+recoderUtils.getFilePath());
  290. XLog.e( "说话时间:"+diff);
  291. if (diff>1000L){
  292. medias.clear();
  293. String mediaPath = recoderUtils.getFilePath();
  294. String pictureType = "audio/mpeg";
  295. int duration = PictureMimeType.getLocalVideoDuration(mediaPath);
  296. LocalMedia media = new LocalMedia();
  297. media.setPath(mediaPath);
  298. media.setPictureType(pictureType);
  299. media.setDuration(duration);
  300. media.setMimeType(PictureMimeType.ofAudio());
  301. medias.add(media);
  302. Intent intent = new Intent().putExtra(PictureConfig.EXTRA_RESULT_SELECTION, (Serializable) medias);
  303. if (audioListener!=null){
  304. audioListener.onSaveResult(intent);
  305. }
  306. }else{
  307. Toasty.error(context, "说话时间太短" , Toast.LENGTH_SHORT).show();
  308. recoderDialog.setShowAlpha(1.0f);
  309. }
  310. }
  311. //回调到
  312. private OnAudioListener audioListener;
  313. public interface OnAudioListener {
  314. void onSaveResult(Intent data);
  315. }
  316. public void setOnAudioListener(OnAudioListener listener) {
  317. this.audioListener = listener;
  318. }
  319. }