package com.andbase.demo.activity; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.widget.Toolbar; import android.util.DisplayMetrics; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.GridView; import com.andbase.demo.R; import com.andbase.demo.adapter.AlbumGridAdapter; import com.andbase.demo.global.MyApplication; import com.andbase.demo.model.ImageInfo; import com.andbase.library.app.base.AbBaseActivity; import com.andbase.library.asynctask.AbTaskItem; import com.andbase.library.asynctask.AbTaskObjectListener; import com.andbase.library.asynctask.AbTaskQueue; import com.andbase.library.http.AbHttpUtil; import com.andbase.library.util.AbAppUtil; import com.andbase.library.util.AbLogUtil; import com.andbase.library.util.AbToastUtil; import java.io.File; import java.util.ArrayList; import java.util.List; /** * * Copyright 2012 amsoft.cn * 名称:AlbumActivity.java * 描述:TODO * @author 还如一梦中 * @date 2015年8月12日 上午11:14:44 * @version v1.0 */ public class AlbumActivity extends AbBaseActivity implements GridView.OnScrollListener{ private MyApplication application; private AbHttpUtil httpUtil; private Toolbar toolbar = null; private ArrayList<ImageInfo> imageInfos = null; private AbTaskQueue task; private GridView gridView = null; private AlbumGridAdapter adapter = null; private int column = 3; private int lastState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE; private int currentPage = 0; private int pageSize = 60; private int firstVisiblePosition = 0; private int lastVisiblePosition = 0; //0 顶部 1中部 2 底部 private int scrollPosition = 0; private boolean loading = false; private boolean hasMore = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_album); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setTitle(R.string.title_choose_album); toolbar.setContentInsetsRelative(0, 0); toolbar.setNavigationIcon(R.drawable.ic_back); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); application = (MyApplication)this.getApplication(); httpUtil = AbHttpUtil.getInstance(this); task = AbTaskQueue.newInstance(); gridView = (GridView)this.findViewById(R.id.grid_view); imageInfos = new ArrayList<ImageInfo>(); DisplayMetrics dm = AbAppUtil.getDisplayMetrics(this); int width = (dm.widthPixels-25)/column; adapter = new AlbumGridAdapter(this,imageInfos,width,width,imageLoader); gridView.setAdapter(adapter); gridView.setOnScrollListener(this); adapter.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(position == 0){ Intent intent = new Intent(AlbumActivity.this, CaptureActivity.class); intent.putExtra("cameraId", 0); intent.putExtra("orientation", 0); startActivity(intent); }else{ ArrayList<String> pathStringArray = new ArrayList<String>(); for(ImageInfo imageInfo:imageInfos){ pathStringArray.add(imageInfo.getPath()); } Intent intent = new Intent(AlbumActivity.this, ImageViewerActivity.class); intent.putStringArrayListExtra("PATH",pathStringArray); intent.putExtra("POSITION",position); startActivity(intent); } AbToastUtil.showToast(AlbumActivity.this,"pos:"+position+",path:"+imageInfos.get(position).getPath()); } }); //Android 版本大于6.0 要代码内申请权限 AbAppUtil.requestSDCardPermission(this); loadData(currentPage+1); } public void loadData(final int page){ loading = true; final AbTaskItem item = new AbTaskItem(); item.setListener(new AbTaskObjectListener() { @Override public <T> T getObject() { List<ImageInfo> list = initData(false,page); return (T)list; } @Override public <T> void update(T t) { List<ImageInfo> list = (List<ImageInfo>)t; if(page == 1){ imageInfos.clear(); } if(list == null || list.size() == 0){ hasMore = false; }else{ currentPage+=1; imageInfos.addAll(list); adapter.setFling(false); adapter.notifyDataSetChanged(); } loading = false; } }); task.execute(item); } /** * 初始化 */ public List<ImageInfo> initData(boolean thumbnails,int page){ List<ImageInfo> pathList = new ArrayList<ImageInfo>(); if(page ==1){ ImageInfo image = new ImageInfo(); image.setThumbnailsPath(String.valueOf(R.drawable.cam_photo)); pathList.add(image); } if(!thumbnails){ String[] projection = {MediaStore.Images.Media._ID,MediaStore.Images.Media.SIZE}; Cursor cursor = this.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.Media._ID+ " DESC limit "+((page-1) * pageSize)+","+pageSize); int columnIDIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); int columnSizeIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); while (cursor.moveToNext()) { int imageID = cursor.getInt(columnIDIndex); int size = cursor.getInt(columnSizeIndex); Uri imageUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + imageID); String realPath = getRealFilePath(AlbumActivity.this,imageUri); //AbLogUtil.e("TAG","SIZE:"+size); if(new File(realPath).exists()){ pathList.add(new ImageInfo(imageID,realPath,realPath)); } } cursor.close(); }else{ //缩略图 手机兼容性问题严重 不可用 String[] projection = {MediaStore.Images.Thumbnails._ID,MediaStore.Images.Thumbnails.IMAGE_ID}; Cursor cursor = this.getContentResolver().query( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, MediaStore.Images.Thumbnails._ID+ " DESC limit "+((page-1) * pageSize)+","+pageSize); int columnIDIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID); int columnImageIDIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID); while (cursor.moveToNext()) { int imageID = cursor.getInt(columnIDIndex); int imageIDReal = cursor.getInt(columnImageIDIndex); Uri imageUri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID); pathList.add(new ImageInfo(imageIDReal,null,getRealFilePath(AlbumActivity.this,imageUri))); } cursor.close(); for(ImageInfo image:pathList){ String[] projection2 = {MediaStore.Images.Media._ID,MediaStore.Images.Media.SIZE}; Cursor cursor2 = this.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection2, ""+MediaStore.Images.Media._ID+"= ? ", new String[]{""+image.getId()}, ""); int columnIDIndex2 = cursor2.getColumnIndexOrThrow(MediaStore.Images.Media._ID); int columnSizeIndex2 = cursor2.getColumnIndexOrThrow(MediaStore.Images.Media._ID); if (cursor2.moveToFirst()) { int imageID2 = cursor2.getInt(columnIDIndex2); int size2 = cursor2.getInt(columnSizeIndex2); Uri imageUri2 = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + imageID2); String realPath2 = getRealFilePath(AlbumActivity.this,imageUri2); //AbLogUtil.e("TAG","SIZE:"+size); image.setPath(realPath2); } cursor.close(); } } return pathList; } public String getRealFilePath(final Context context, final Uri uri ) { if ( null == uri ) return null; final String scheme = uri.getScheme(); String data = null; if ( scheme == null ) data = uri.getPath(); else if ( ContentResolver.SCHEME_FILE.equals( scheme ) ) { data = uri.getPath(); } else if ( ContentResolver.SCHEME_CONTENT.equals( scheme ) ) { Cursor cursor = context.getContentResolver().query( uri, new String[] { MediaStore.Images.ImageColumns.DATA }, null, null, null ); if ( null != cursor ) { if ( cursor.moveToFirst() ) { int index = cursor.getColumnIndex( MediaStore.Images.ImageColumns.DATA ); if ( index > -1 ) { data = cursor.getString( index ); } } cursor.close(); } } return data; } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_album, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_scan) { //扫描 initData(false,1); return true; } return super.onOptionsItemSelected(item); } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem + visibleItemCount == totalItemCount) { //底部 toolbar.setSubtitle("底部"); //加载下一页 if(!loading && hasMore && scrollPosition!=2 && currentPage!=0){ loadData(currentPage+1); //AbLogUtil.e(AlbumActivity.class,"底部"); } scrollPosition = 2; } else { toolbar.setSubtitle("中部"); //AbLogUtil.e(AlbumActivity.class,"中部"); scrollPosition = 1; } if (firstVisibleItem == 0) { toolbar.setSubtitle("顶部"); //AbLogUtil.e(AlbumActivity.class,"顶部"); scrollPosition = 0; } } public void onScrollStateChanged(final AbsListView view, int scrollState) { switch (scrollState) { case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: lastState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE; this.setTitle("Idle"); //已经显示过了 if(firstVisiblePosition == view.getFirstVisiblePosition()){ return; } //已经显示过了 if(lastVisiblePosition == view.getLastVisiblePosition()){ return; } //从sroll切换到空闲状态不需要刷新界面 if(lastState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){ return; } //当前显示的 从多少到都少 firstVisiblePosition = view.getFirstVisiblePosition(); lastVisiblePosition = view.getLastVisiblePosition(); //可见的数量,从0开始的View final int count = lastVisiblePosition - firstVisiblePosition + 1; //AbLogUtil.e("TAG","startPosition:"+startPosition +",endPosition:"+endPosition+",count:"+count); //当前显示的 从0-count,和scroll 会有重复 已经解决 for (int i = 0; i < count; i++) { final View item = view.getChildAt(i); int realPosition = i+firstVisiblePosition; if(item!=null){ //AbLogUtil.e("TAG","realPosition:"+realPosition); AlbumGridAdapter.ViewHolder holder = (AlbumGridAdapter.ViewHolder) item.getTag(); adapter.loadImage(realPosition,holder); } } break; case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: //只能监听到开始滑动的那一次时间,其他的在onScroll中判断 adapter.setFling(false); lastState = AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL; this.setTitle("Touch scroll"); break; case AbsListView.OnScrollListener.SCROLL_STATE_FLING: adapter.setFling(true); lastState = AbsListView.OnScrollListener.SCROLL_STATE_FLING; this.setTitle("Fling"); break; } } }