我也有微信朋友圈了 Android实现

2019-12-10 18:01:32丽君

微信朋友圈,Android           

多图片选择实现代码

MultipleActivity

package com.yzl.xyb.friends; 
 
import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.List; 
 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.ContentResolver; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.provider.MediaStore; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup.LayoutParams; 
import android.view.WindowManager; 
import android.widget.GridView; 
import android.widget.PopupWindow.OnDismissListener; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 
 
import com.yzl.xyb.friends.adapter.MyAdapter; 
import com.yzl.xyb.friends.adapter.MyAdapter.SetCountListener; 
import com.yzl.xyb.friends.picture.ListImageDirPopupWindow; 
import com.yzl.xyb.friends.picture.ListImageDirPopupWindow.OnImageDirSelected; 
import com.yzl.xyb.friends.util.ImageFloder; 
/** 
 * 从相册选取图片 
 * 可以选择多张,最多可选9张 
 * 获取所有相册 
 * 确定:返回已选图片的路径 
 * @author hou 
 * 
 */ 
public class MultipleActivity extends Activity implements OnImageDirSelected, SetCountListener{ 
  private TextView selectCount; 
  private TextView selectPicture; 
  private TextView mChooseDir; 
  private ProgressDialog mProgressDialog; 
  public static final int KITKAT_LESS = 2; 
  /** 
   * 存储文件夹中的图片数量 
   */ 
  private int mPicsSize; 
  /** 
   * 图片数量最多的文件夹 
   */ 
  private File mImgDir; 
  /** 
   * 所有的图片 
   */ 
  private List<String> mImgs; 
  private ArrayList<String> pictures; 
 
  private GridView mGirdView; 
  private MyAdapter mAdapter; 
  /** 
   * 临时的辅助类,用于防止同一个文件夹的多次扫描 
   */ 
  private HashSet<String> mDirPaths = new HashSet<String>(); 
 
  /** 
   * 扫描拿到所有的图片文件夹 
   */ 
  private List<ImageFloder> mImageFloders = new ArrayList<ImageFloder>(); 
 
  private RelativeLayout mBottomLy; 
 
  int totalCount = 0; 
 
  private int mScreenHeight; 
 
  private ListImageDirPopupWindow mListImageDirPopupWindow; 
 
  private Handler mHandler = new Handler() 
  { 
    public void handleMessage(android.os.Message msg) 
    { 
      mProgressDialog.dismiss(); 
      // 为View绑定数据 
      data2View(); 
      // 初始化展示文件夹的popupWindw 
      initListDirPopupWindw(); 
    } 
  }; 
   
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) 
  { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.picture_selector); 
    getIntent().getExtras(); 
    DisplayMetrics outMetrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(outMetrics); 
    mScreenHeight = outMetrics.heightPixels; 
 
    initView(); 
    getImages(); 
    initEvent(); 
 
  } 
 
  /** 
   * 初始化View 
   */ 
  private void initView() 
  { 
    mGirdView = (GridView) findViewById(R.id.id_gridView); 
    mChooseDir = (TextView) findViewById(R.id.id_choose_dir); 
    selectCount = (TextView) findViewById(R.id.tv_select_count); 
//   allPhotoAlum = (TextView) findViewById(R.id.tv_photoAlum); 
    selectPicture= (TextView) findViewById(R.id.tv_sure); 
    mBottomLy = (RelativeLayout) findViewById(R.id.id_bottom_ly); 
  } 
 
  private void initEvent() 
  { 
    /** 
     * 为底部的布局设置点击事件,弹出popupWindow 
     */ 
    mBottomLy.setOnClickListener(new OnClickListener() 
    { 
      @Override 
      public void onClick(View v) 
      { 
        mListImageDirPopupWindow 
            .setAnimationStyle(R.style.anim_popup_dir); 
        mListImageDirPopupWindow.showAsDropDown(mBottomLy, 0, 0); 
 
        // 设置背景颜色变暗 
        WindowManager.LayoutParams lp = getWindow().getAttributes(); 
        lp.alpha = .3f; 
        getWindow().setAttributes(lp); 
      } 
    }); 
     
    selectPicture.setOnClickListener(new OnClickListener() { 
       
      @Override 
      public void onClick(View v) { 
        pictures=mAdapter.getSelectPath(); 
        Log.i("选中的图片1>>>>>>",pictures.size()+"----------"); 
        Intent intent=new Intent(); 
//       intent.setClass(MultipleActivity.this, CreatePostActivity.class); 
        Bundle bundle=new Bundle(); 
        bundle.putStringArrayList("PICTURES", pictures); 
        intent.putExtras(bundle); 
//       startActivityForResult(intent, KITKAT_LESS); 
        setResult(KITKAT_LESS, intent);  
        finish(); 
      } 
    }); 
  } 
 
  /** 
   * 为View绑定数据 
   */ 
  private void data2View() 
  { 
    if (mImgDir == null) 
    { 
      Toast.makeText(getApplicationContext(), "擦,一张图片没扫描到", 
          Toast.LENGTH_SHORT).show(); 
      return; 
    } 
 
    mImgs = Arrays.asList(mImgDir.list()); 
    /** 
     * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗; 
     */ 
    mAdapter = new MyAdapter(getApplicationContext(), mImgs, 
        R.layout.grid_item, mImgDir.getAbsolutePath()); 
    mAdapter.setCountListener(this); 
    mGirdView.setAdapter(mAdapter); 
//   allPictureCount.setText("共"+totalCount + "张"); 
  }; 
 
  /** 
   * 初始化展示文件夹的popupWindw 
   */ 
  private void initListDirPopupWindw() 
  { 
    mListImageDirPopupWindow = new ListImageDirPopupWindow( 
        LayoutParams.MATCH_PARENT, (int) (mScreenHeight * 1), 
        mImageFloders, LayoutInflater.from(getApplicationContext()) 
            .inflate(R.layout.list_dir, null)); 
 
    mListImageDirPopupWindow.setOnDismissListener(new OnDismissListener() 
    { 
 
      @Override 
      public void onDismiss() 
      { 
        // 设置背景颜色变暗 
        WindowManager.LayoutParams lp = getWindow().getAttributes(); 
        lp.alpha = 1.0f; 
        getWindow().setAttributes(lp); 
      } 
    }); 
    // 设置选择文件夹的回调 
    mListImageDirPopupWindow.setOnImageDirSelected(this); 
  } 
 
  /** 
   * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹 
   */ 
  private void getImages() 
  { 
    if (!Environment.getExternalStorageState().equals( 
        Environment.MEDIA_MOUNTED)) 
    { 
      Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show(); 
      return; 
    } 
    // 显示进度条 
    mProgressDialog = ProgressDialog.show(this, null, "正在加载..."); 
 
    new Thread(new Runnable() 
    { 
      @Override 
      public void run() 
      { 
 
        String firstImage = null; 
 
        Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
        ContentResolver mContentResolver = MultipleActivity.this 
            .getContentResolver(); 
 
        // 只查询jpeg和png的图片 
        Cursor mCursor = mContentResolver.query(mImageUri, null, 
            MediaStore.Images.Media.MIME_TYPE + "=? or " 
                + MediaStore.Images.Media.MIME_TYPE + "=?", 
            new String[] { "image/jpeg", "image/png" }, 
            MediaStore.Images.Media.DATE_MODIFIED); 
 
        Log.e("TAG", mCursor.getCount() + ""); 
        while (mCursor.moveToNext()) 
        { 
          // 获取图片的路径 
          String path = mCursor.getString(mCursor 
              .getColumnIndex(MediaStore.Images.Media.DATA)); 
 
          Log.e("TAG", path); 
          // 拿到第一张图片的路径 
          if (firstImage == null) 
            firstImage = path; 
          // 获取该图片的父路径名 
          File parentFile = new File(path).getParentFile(); 
          if (parentFile == null) 
            continue; 
          String dirPath = parentFile.getAbsolutePath(); 
          ImageFloder imageFloder = null; 
          // 利用一个HashSet防止多次扫描同一个文件夹(不加这个判断,图片多起来还是相当恐怖的~~) 
          if (mDirPaths.contains(dirPath)) 
          { 
            continue; 
          } else 
          { 
            mDirPaths.add(dirPath); 
            // 初始化imageFloder 
            imageFloder = new ImageFloder(); 
            imageFloder.setDir(dirPath); 
            imageFloder.setFirstImagePath(path); 
          } 
 
          int picSize = parentFile.list(new FilenameFilter() 
          { 
            @Override 
            public boolean accept(File dir, String filename) 
            { 
              if (filename.endsWith(".jpg") 
                  || filename.endsWith(".png") 
                  || filename.endsWith(".jpeg")) 
                return true; 
              return false; 
            } 
          }).length; 
          totalCount += picSize; 
 
          imageFloder.setCount(picSize); 
          mImageFloders.add(imageFloder); 
 
          if (picSize > mPicsSize) 
          { 
            mPicsSize = picSize; 
            mImgDir = parentFile; 
          } 
        } 
        mCursor.close(); 
 
        // 扫描完成,辅助的HashSet也就可以释放内存了 
        mDirPaths = null; 
 
        // 通知Handler扫描图片完成 
        mHandler.sendEmptyMessage(0x110); 
 
      } 
    }).start(); 
 
  } 
 
   
 
  @Override 
  public void selected(ImageFloder floder) 
  { 
 
    mImgDir = new File(floder.getDir()); 
    mImgs = Arrays.asList(mImgDir.list(new FilenameFilter() 
    { 
      @Override 
      public boolean accept(File dir, String filename) 
      { 
        if (filename.endsWith(".jpg") || filename.endsWith(".png") 
            || filename.endsWith(".jpeg")) 
          return true; 
        return false; 
      } 
    })); 
    /** 
     * 可以看到文件夹的路径和图片的路径分开保存,极大的减少了内存的消耗; 
     */ 
    mAdapter = new MyAdapter(getApplicationContext(), mImgs, 
        R.layout.grid_item, mImgDir.getAbsolutePath()); 
    mAdapter.setCountListener(this); 
    mGirdView.setAdapter(mAdapter); 
//    mAdapter.notifyDataSetChanged(); 
//   mImageCount.setText(floder.getCount() + "张"); 
    mChooseDir.setText(floder.getName()); 
    selectCount.setText("/9"); 
    mListImageDirPopupWindow.dismiss(); 
 
  } 
 
  @Override 
  public void doCount(int a) { 
    selectCount.setText(a+"/9"); 
  } 
   
 
}