基于android的朋友圈

最近几天写了一个简单的朋友圈程序,包含了朋友圈的列表实现,视频的录制、预览与上传,图片可选择拍照或者从相册选取,从相册选取可以一次选择多张照片,并且限制照片的张数。大致也就这些功能了。

FriendsListActivity  代码如下

public class FriendsListActivity extends BaseActivity implements OnRefreshListener<ListView>, PostListener {
	private InteractionAdapter mAdapter;
	private PullToRefreshListView mRefreshListView;
	private View mFooter;
	private Context mContext;
	private Button btnToPost;
	protected int mPage = 0;
	private boolean isRefreshing = false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.friends_list);
		mContext=getApplicationContext();
		mAdapter = new InteractionAdapter(mContext);
		mAdapter.setListener(this);
		btnToPost=(Button) findViewById(R.id.btn_topost);
		mRefreshListView = (PullToRefreshListView) findViewById(R.id.friends_list);
		FriendsApi.getFriendsList(mContext, mCallBack);
		mRefreshListView.setOnRefreshListener(this);
		mFooter = LayoutInflater.from(mContext).inflate(R.layout.loading_footer, null);
//		mRefreshListView.getRefreshableView().addFooterView(mFooter);
		mRefreshListView.setAdapter(mAdapter);
//		mRefreshListView.setOnLastItemVisibleListener(mLastListener);
//		mRefreshListView.getRefreshableView().setDividerHeight(40);
		btnToPost.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				myPosts();
			}
		});
	}

	protected void myPosts() {
		new AlertDialog.Builder(this).setItems(new String[]{"图片","视频","文字"}, new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				Intent intent=new Intent();
				switch (which) {
				case 0:
					intent.setClass(FriendsListActivity.this, CreatePostActivity.class);
					break;
				case 1:
					intent.setClass(FriendsListActivity.this, RecorderActivity.class);
					break;
				case 2:
					intent.setClass(FriendsListActivity.this, RecorderActivity.class);
					break;
				default:
					break;
				}
				startActivity(intent);
			}
		}).show();

	}
	/**
	 * 查看更多操作
	 */
	@Override
	public void show(Interaction interaction) {

	}

	@Override
	public void delete(Interaction interaction) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onRefresh(PullToRefreshBase<ListView> refreshView) {
		if (!isRefreshing) {
	        isRefreshing = true;
	        mPage = 0;
	        FriendsApi.getFriendsList(mContext, mCallBack);
	    }
	}

	protected NetCallBack mCallBack = new NetCallBack() {

		public void friendslist(ArrayList<Interaction> friends) {
			Log.i("friends size>>>>",friends.size()+"-------------");
			mAdapter.setInteractions(friends);
//			mRefreshListView.getLoadingLayoutProxy().setLastUpdatedLabel(null);
			mRefreshListView.onRefreshComplete();
			isRefreshing = false;
			dismissLoading();
		};

		public void start() {
			showLoading();
		};

		public void failed(String message) {
			loadFailed();
		};
	};
	@Override
	public void play(Interaction interaction) {
		Intent mIntent=new Intent();
		mIntent.setClass(FriendsListActivity.this, RecorderPlayActivity.class);
		Bundle data = new Bundle();
		data.putString("path", interaction.videoPath);
		mIntent.putExtras(data);
		startActivity(mIntent);
	}
}

布局文件 friends_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/backgroud_color" >
    <include
        android:id="@+id/list_title"
        android:layout_alignParentTop="true"
        layout="@layout/list_title"/>

    <com.yzl.xyb.friends.refresh.view.PullToRefreshListView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/friends_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/padding_left"
        android:divider="@android:color/transparent"
        android:layout_below="@+id/list_title"
        app:ptrOverScroll="false"
        app:ptrHeaderTextColor="#ff666666"
        app:ptrHeaderTextAppearance="@android:style/TextAppearance.Small"
        app:ptrShowIndicator="false"/>
     <include layout="@layout/loading"/>
</RelativeLayout>

适配器 InteractionAdapter 对朋友圈列表进行数据填充

public class InteractionAdapter extends BaseAdapter implements OnClickListener {
	private ArrayList<Interaction> interactions;
	private Context mContext;
	private FinalBitmap mFinal;
	private BitmapDisplayConfig config;
	private BitmapDisplayConfig imageConfig;
	private PostListener listener;
	public InteractionAdapter(Context context) {
		mContext = context;
		mFinal = FinalBitmap.create(mContext);
		Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.user_avatar);
		config = new BitmapDisplayConfig();
		config.setAnimationType(BitmapDisplayConfig.AnimationType.fadeIn);
		config.setLoadfailBitmap(bitmap);
		config.setLoadfailBitmap(bitmap);

		bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.image_failed);
		imageConfig = new BitmapDisplayConfig();
		imageConfig.setAnimationType(BitmapDisplayConfig.AnimationType.fadeIn);
		imageConfig.setLoadfailBitmap(bitmap);
		imageConfig.setLoadfailBitmap(bitmap);
	}

	public void setListener(PostListener listener) {
		this.listener = listener;
	}

	public void setInteractions(ArrayList<Interaction> interactions) {
		this.interactions = interactions;
		notifyDataSetChanged();
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return interactions == null ? 0 : interactions.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return interactions.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder holder = null;
		if (convertView == null) {
			convertView = LayoutInflater.from(mContext).inflate(R.layout.friend_list_item, null);
			holder = new ViewHolder();
			holder.avatar = (CircleImageView) convertView.findViewById(R.id.avatar);
			holder.content = (TextView) convertView.findViewById(R.id.content);
			holder.title = (TextView) convertView.findViewById(R.id.title);
			holder.subtitle = (TextView) convertView.findViewById(R.id.subtitle);
			holder.image = convertView.findViewById(R.id.image_layout);
			holder.image0 = (ImageView) convertView.findViewById(R.id.image0);
			holder.image1 = (ImageView) convertView.findViewById(R.id.image1);
			holder.image2 = (ImageView) convertView.findViewById(R.id.image2);
			holder.conments = (TextView) convertView.findViewById(R.id.conment_count);
			holder.praises = (TextView) convertView.findViewById(R.id.parise_count);
			holder.praised = (ImageView) convertView.findViewById(R.id.praise_icon);
			holder.more = (TextView) convertView.findViewById(R.id.more);
			holder.viewLayout=(LinearLayout) convertView.findViewById(R.id.view_layout);
			holder.surfaceView=(SurfaceView) convertView.findViewById(R.id.surface_view_result);
			holder.playButton=(ImageButton) convertView.findViewById(R.id.btn_play_result);
			holder.audioLayout=(FrameLayout) convertView.findViewById(R.id.audio_layout);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		Interaction interaction = interactions.get(position);
		if (TextUtils.isEmpty(interaction.avatar)) {
			holder.avatar.setImageBitmap(config.getLoadfailBitmap());
		} else {
			mFinal.display(holder.avatar, interaction.avatar, config);
		}
		holder.title.setText(interaction.name);
		holder.subtitle.setText(interaction.subtitle);
		holder.content.setText(interaction.content);

		holder.conments.setText(String.valueOf(interaction.commentCount));
		holder.praises.setText(String.valueOf(interaction.praiseCount));

		int images = interaction.images == null ? 0 : interaction.images.size();

		if (images > 0) {
			holder.image.setVisibility(View.VISIBLE);
			holder.audioLayout.setVisibility(View.GONE);
			holder.image.setOnClickListener(this);
			holder.image.setTag(interaction);
			if (images <= 1) {
				mFinal.display(holder.image0, interaction.images.get(0), imageConfig);
				holder.image1.setImageBitmap(null);
				holder.image2.setImageBitmap(null);
			} else if (images <= 2) {
				mFinal.display(holder.image0, interaction.images.get(0), imageConfig);
				mFinal.display(holder.image1, interaction.images.get(1), imageConfig);
				holder.image2.setImageBitmap(null);
			} else {
				mFinal.display(holder.image0, interaction.images.get(0), imageConfig);
				mFinal.display(holder.image1, interaction.images.get(1), imageConfig);
				mFinal.display(holder.image2, interaction.images.get(2), imageConfig);

			}
		} else if(interaction.videoPath!=null)
		{
				holder.image.setVisibility(View.GONE);
				holder.playButton.setBackgroundResource(R.drawable.play1pressed);
				holder.audioLayout.setVisibility(View.VISIBLE);
				holder.playButton.setTag(interaction);
				holder.playButton.setOnClickListener(this);
				holder.surfaceView.setTag(interaction);
				holder.surfaceView.setOnClickListener(this);
		}else{
			holder.viewLayout.setVisibility(View.GONE);
		}

		holder.more.setTag(interaction);
		holder.more.setOnClickListener(this);

		return convertView;
	}

	private class ViewHolder {
		CircleImageView avatar;
		TextView title;
		TextView subtitle;
		TextView content;
		View image;
		ImageView image0;
		ImageView image1;
		ImageView image2;
		TextView conments;
		TextView praises;
		ImageView praised;
		View delete;
		TextView more;
		SurfaceView surfaceView;
		ImageButton playButton;
		FrameLayout audioLayout;
		LinearLayout viewLayout;
	}

	@Override
	public void onClick(View v) {
		int id = v.getId();
		if (id == R.id.btn_play_result) {
			Interaction interaction = (Interaction) v.getTag();
		}else if (id == R.id.surface_view_result) {
			if (this.listener != null) {
				this.listener.play((Interaction) v.getTag());
			}
		}else if (id == R.id.more) {
			if (this.listener != null) {
				this.listener.show((Interaction) v.getTag());
			}
		} else if (id == R.id.image_layout) {
			Intent intent = new Intent(mContext, MainActivity.class);
			Bundle data = new Bundle();
			Interaction interaction = (Interaction) v.getTag();
			data.putStringArrayList("images", interaction.images);
			intent.putExtras(data);
			mContext.startActivity(intent);
		}
	}

	public interface PostListener {
		void show(Interaction interaction);
		void delete(Interaction interaction);
		void play(Interaction interaction);
	}

多图片选择实现代码

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");
	}

}

视频的录制与预览

package com.yzl.xyb.friends;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.Toast;

import com.yzl.xyb.friends.view.MovieRecorderView;
import com.yzl.xyb.friends.view.MovieRecorderView.OnRecordFinishListener;
/**
 * 录制视频
 * @author hou
 *
 */
public class RecorderActivity extends Activity {

	private MovieRecorderView mRecorderView;
	private Button mShootBtn;
	private boolean isFinish = true;
	private String userId = "";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.record_activity);
//		userId=getIntent().getParcelableExtra("userId");
		mRecorderView = (MovieRecorderView) findViewById(R.id.movieRecorderView);
		mShootBtn = (Button) findViewById(R.id.shoot_button);

		mShootBtn.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_DOWN) {
					mRecorderView.record(new OnRecordFinishListener() {

						@Override
						public void onRecordFinish() {
							Log.i("MotionEvent>>>","ACTION_DOWN");
							handler.sendEmptyMessage(1);
						}
					});
				} else if (event.getAction() == MotionEvent.ACTION_UP) {
					Log.i("MotionEvent>>>","ACTION_UP");
					if (mRecorderView.getTimeCount() > 1)
						handler.sendEmptyMessage(1);
					else {
						if (mRecorderView.getmVecordFile() != null)
							mRecorderView.getmVecordFile().delete();
						mRecorderView.stop();
						Toast.makeText(RecorderActivity.this, "时间太短,录制失败", Toast.LENGTH_SHORT).show();
					}
				}
				return true;
			}
		});
	}

	@Override
	public void onResume() {
		super.onResume();
		isFinish = true;
	}

	@Override
	public void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		isFinish = false;
		mRecorderView.stop();
	}

	@Override
	public void onPause() {
		super.onPause();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			finishActivity();
			Log.i("isFinish>>>",isFinish+"");
		}
	};

	private void finishActivity() {
		if (isFinish) {
			mRecorderView.stop();

			Intent intent = new Intent(RecorderActivity.this, TopicActivity.class);
			Bundle mBundle = new Bundle();
			mBundle.putString("path", mRecorderView.getmVecordFile().toString());
			mBundle.putString("userId", userId);
			intent.putExtras(mBundle);
			startActivity(intent);
		}
	} 

	public interface OnShootCompletionListener {
		public void OnShootSuccess(String path, int second);
		public void OnShootFailure();
	}
}

视频的预览

package com.yzl.xyb.friends;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;

public class RecorderPlayActivity extends Activity implements SurfaceHolder.Callback, OnClickListener {

	private ImageView ivBack;
	private ImageButton btnPlay;
	private SurfaceView surfaceView;
	private SurfaceHolder surfaceHolder;
	private String path=null;
	private MediaPlayer player;
	private boolean play=false;

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.recorder_play);
		ivBack=(ImageView) findViewById(R.id.iv_back);
		btnPlay=(ImageButton) findViewById(R.id.ib_play);
		surfaceView=(SurfaceView) findViewById(R.id.play_view);
		btnPlay.setBackground(getResources().getDrawable(R.drawable.play1pressed));
		path=this.getIntent().getStringExtra("path");
		System.out.println("surface created>>>> path= "+path);
		surfaceHolder=surfaceView.getHolder();
		surfaceHolder.addCallback(this);
		surfaceHolder.setFixedSize(320, 220);
		surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
		System.out.println("oncreate--------------");
		ivBack.setOnClickListener(this);
		btnPlay.setOnClickListener(this);
		surfaceView.setOnClickListener(this);
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		player=new MediaPlayer();
		player.setAudioStreamType(AudioManager.STREAM_MUSIC);
		player.setDisplay(surfaceHolder);
		try {
			System.out.println("surface created>>>> path= "+path);
			player.setDataSource(path);
			player.prepare();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub

	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.iv_back:
			this.finish();
			break;
		case R.id.ib_play:
			player.start();
			btnPlay.setVisibility(View.GONE);
			break;
		case R.id.play_view:
			player.pause();
			/*if(play){
				player.start();
			}else {
				player.pause();
			}*/
			btnPlay.setVisibility(View.VISIBLE);
			break;

		default:
			break;
		}
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		if(player.isPlaying())
		{
			player.stop();
		}
		player.release();
	}
}
时间: 2024-10-04 20:05:40

基于android的朋友圈的相关文章

Android 实现朋友圈有图片和视频

最近开发比较烦,这个作为我第一篇博客吧. 效果就是图上的样子. 首先是布局文件,没什么就是一个RecycleView <android.support.v7.widget.RecyclerView android:id="@+id/dis_rv" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.

基于微信群控系统分析几十万几百万用户微信朋友圈和聊天记录数据

基于微信群控系统分析几十万几百万用户朋友圈和聊天记录数据打造针对用户的智能推荐系统 用户属性: 姓名.性别.年龄.所在地区.常驻地区.手机号码.微信号码.职业.岗位.身份证等等 用户行为:1.通过图文分析,定位所在区域.行业.大概的收入状况.喜好:2.如果是微商,分析常发微信圈产品:3.综合分析朋友圈人气状况:4.给用户打标签:5.产品匹配. 建立用户画像标签和大数据分析实现智能推荐系统 需要用到的技术 朋友圈抓取技术.高并发架构.大数据分析架构 安卓开发 python  mongodb spa

Android 微信分享,分享到朋友圈与分享到好友,以及微信登陆

extends:http://www.cnblogs.com/android100/p/Android-qq.html 一.申请你的AppID http://open.weixin.qq.com/ 友情提示:推荐使用eclipse打包软件最后一步的MD5值去申请AppID 二.官网下载libammsdk.jar包 http://open.weixin.qq.com/download/?lang=zh_CN 三.将libammsdk.jar复制到工程的libs目录 四.在需要分享的Activity

android 滚动栏下拉反弹的效果(相似微信朋友圈)

微信朋友圈上面的图片封面,QQ空间说说上面的图片封面都有下拉反弹的效果,这些都是使用滚动栏实现的.下拉,当松开时候.反弹至原来的位置.下拉时候能看到背景图片.那么这里简介一下这样的效果的实现. 本文源代码下载:点击 1.效果图 这部手机显示的分辨率有限,非常老的手机调试. 2.具有反弹效果BounceScrollView package com.org.scroll; import android.content.Context; import android.graphics.Rect; im

android网页分享到朋友圈问题求助?

目前想要实现通过QQ将网页分享到微信好友或朋友圈,看见有些APP是直接分享出去左下角图标显示的是QQ.求助各位大牛提供下思路. 这种功能是怎么实现的.应该不是通过android的系统分享实现的吧?.查了几天的资料仍然没有思路,求助各位大牛 这种功能是怎么实现的.应该不是通过android的系统分享实现的吧?.查了几天的资料仍然没有思路,求助各位大牛 这种功能是怎么实现的.应该不是通过android的系统分享实现的吧?.查了几天的资料仍然没有思路,求助各位大牛 这种功能是怎么实现的.应该不是通过a

Android实现分享内容到微信朋友圈

原文地址:http://yanwushu.sinaapp.com/android_wechat_share/ 由于需求,要实现在应用中实现分享文字+图片到微信朋友圈.在网上找了一些资料,总结如下: 思路 1.使用android的intent实现应用程序之间的通信,将信息通过intent传递给微信(文章后面资源链接中有案例).这种方式的局限性在于 a.只能发送图片,而不是(文字或者图片+文字). b.设备必须安装微信才能实现分享. 2.使用微信的官方sdk包,实现发送文字+图片发送到朋友圈.这种方

android 微信朋友分享,朋友圈分享

包名必须写成  com.weixin WXEntryActivity package com.weixin.wxapi; import android.app.Activity; import android.os.Bundle; import com.tencent.mm.sdk.openapi.BaseReq; import com.tencent.mm.sdk.openapi.BaseResp; import com.tencent.mm.sdk.openapi.IWXAPI; impor

请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果。

============问题描述============ 请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果.弹出来图片大小超过32kb,然后分享中 就没反应了 ============解决方案1============ 引用 楼主 zpq19870824 的回复: 请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果.弹出来图片大小超过32kb,然后分享中 就没反应了 我也不知道,帮你顶一下吧...

android 嵌套的listview示例(可参考实现朋友圈评论)

最近在项目中用到listview中再嵌套一个listview,两层也有监听,都没有问题.其实,主要解决里面那一层的listview的高度计算就可以,外面那一层listview自动计算.加上里面那层展开的,就是高度.这种解决方案经常应用于朋友圈的评论.每一条说说,然后下面有评论. 项目下载地址:http://download.csdn.net/detail/qq_16064871/9334993 1.项目结构图 2.实现效果图 这上面效果图的监听两层都有,以及外面的button都可以.够多样化吧.