android 定时拍照并发送微博

最近在做android方面的开发,下面是android自动对焦并拍照的小例子:

package com.comnvi.camera;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.comnvi.camera.share.AccessTokenKeeper;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.weibo.oauthv2.OAuthV2;
import com.weibo.sdk.android.Oauth2AccessToken;
import com.weibo.sdk.android.Weibo;
import com.weibo.sdk.android.WeiboAuthListener;
import com.weibo.sdk.android.WeiboDialogError;
import com.weibo.sdk.android.WeiboException;
import com.weibo.sdk.android.api.StatusesAPI;
import com.weibo.sdk.android.net.RequestListener;
import com.weibo.sdk.android.sso.SsoHandler;

import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity{
	private Weibo mWeibo;
	SsoHandler mSsoHandler;
	public static final String SINA_CONSUMER_KEY = "2022960751";
	public static final String SINA_REDIRECT_URL = "http://sns.whalecloud.com/sina2/callback";
	// 按钮面板
	private View mPannelController;
	// 报像头
	private Camera mCamera;
	public static Oauth2AccessToken accessToken;
	StatusesAPI api;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		System.out.println("onCreate");

		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(R.layout.main);

		mPannelController = this.findViewById(R.id.buttonlayout);
		// 创建 定时线程 注意不要使用Timer
		pool = Executors.newFixedThreadPool(1);
		// 预览控件
		SurfaceView surfaceView = (SurfaceView) this
				.findViewById(R.id.surfaceView);
		// 设置参数
		surfaceView.getHolder().setFixedSize(176, 144);
		surfaceView.getHolder().setKeepScreenOn(true);
		surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
		surfaceView.getHolder().addCallback(new SurfaceCallback());
		// 添加事件
		final Button start = (Button) findViewById(R.id.takepicture);
		start.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (mCamera != null) {
					start.setEnabled(false);
					// 拍照前需要对焦 获取清析的图片
					mCamera.autoFocus(new AutoFocusCallback() {
						// 对焦结束
						@Override
						public void onAutoFocus(boolean success, Camera camera) {
							// 对焦成功
							Toast.makeText(MainActivity.this, "对焦成功 !!",
									Toast.LENGTH_SHORT).show();
							mIsRunning = true;
							// 10s 一张
							pool.execute(mRunnable);
							//mCamera.takePicture(null, null, new MyPictureCallback());
						}
					});
				}
			}
		});

		Button end = (Button) findViewById(R.id.endtake);
		end.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mIsRunning = false;
				// 取消任务
				start.setEnabled(true);

			}
		});
		 mWeibo = Weibo.getInstance(SINA_CONSUMER_KEY, SINA_REDIRECT_URL);
		 accessToken = AccessTokenKeeper.readAccessToken(this);
		Button sina = (Button) findViewById(R.id.sina);
		sina.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mSsoHandler = new SsoHandler(MainActivity.this, mWeibo);
				mSsoHandler.authorize(new UserInfoListener());
			}
		});
	}
	class UserInfoListener implements WeiboAuthListener{
		@Override
		public void onCancel() {
			Log.v("sina", "------onCancel");
		}
		

		@Override
		public void onComplete(Bundle arg0) {
			String token = arg0.getString("access_token");
			String expires_in = arg0.getString("expires_in");
			accessToken = new Oauth2AccessToken(
					 token, expires_in);
			
		}

		@Override
		public void onError(WeiboDialogError arg0) {
			Log.v("sina", "------onError"+arg0.getMessage());
			
		}

		@Override
		public void onWeiboException(WeiboException arg0) {
			Log.v("sina", "------onWeiboException"+arg0.getMessage());
			
		}
		
  }
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (mSsoHandler != null) {
			Log.v("time", "sso回调");
			mSsoHandler.authorizeCallBack(requestCode, resultCode, data);

		}
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		mIsRunning = false;
		if (pool != null) {
			pool.shutdownNow();
		}
	}

	// 定时器
	private ExecutorService pool = null;
	private boolean mIsRunning = true;
	// 定时任务
	private Runnable mRunnable = new Runnable() {
		@Override
		public void run() {
			// 定时触发拍照方法
			while (mIsRunning) {
				mCamera.takePicture(null, null, new MyPictureCallback());
				try {
					Thread.sleep(100* 1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

		}
	};
	public void share(String path){
		if (accessToken.isSessionValid()&&!"".equals(path)) {
			AccessTokenKeeper.keepAccessToken(MainActivity.this, accessToken);
			api = new StatusesAPI(accessToken);
			Date now=new Date();
			SimpleDateFormat temp=new SimpleDateFormat("MM月dd日  HH:mm");
			String str=temp.format(now);
			
			api.upload(str+"测试分享", path, "0", "0", new RequestListener() {
				
				@Override
				public void onIOException(IOException arg0) {
					Log.v("sina", "分享失败"+arg0.getMessage());
				}
				
				@Override
				public void onError(WeiboException arg0) {
					Log.v("sina", "分享失败"+arg0.getMessage());
				}
				
				@Override
				public void onComplete(String arg0) {
					Log.v("sina", "分享成功"+arg0);
				}
			});
		}else{
			mSsoHandler = new SsoHandler(MainActivity.this, mWeibo);
			mSsoHandler.authorize(new UserInfoListener());
			share(path);
		}
	}
	// 照片回调
	private final class MyPictureCallback implements PictureCallback {
		// 照片生成后
		public void onPictureTaken(byte[] data, Camera camera) {
			try {

				System.out.println("onPictureTaken");
				File jpgFile = new File(
						Environment.getExternalStorageDirectory()+"/ceshi");
				if (!jpgFile.exists()) {
					jpgFile.mkdir();
				}
				File jpgFile1 = new File(
						jpgFile.getAbsoluteFile(),
						System.currentTimeMillis() + ".jpg");

				System.out.println(jpgFile1.getAbsolutePath());
				Toast.makeText(MainActivity.this,
						"保存成功 !!" + jpgFile1.getAbsolutePath(),
						Toast.LENGTH_SHORT).show();
				FileOutputStream outStream = new FileOutputStream(jpgFile1);
				outStream.write(data);
				outStream.close();
				share(jpgFile1.getAbsolutePath());
				camera.startPreview();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

	// 预览界面回调
	private final class SurfaceCallback implements Callback {
		// 预览界面被创建
		public void surfaceCreated(SurfaceHolder holder) {
			try {
				System.out.println("surfaceCreated");
				mCamera = Camera.open();// 打开摄像头
				Camera.Parameters parameters = mCamera.getParameters();
				parameters.setPreviewSize(800, 480);
				parameters.setPreviewFrameRate(5);
				parameters.setPictureSize(1024, 768);
				parameters.setJpegQuality(80);
				mCamera.setParameters(parameters);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		public void surfaceChanged(SurfaceHolder holder, int format, int width,
				int height) {
			System.out.println("surfaceChanged");
			
			try {
				mCamera.setPreviewDisplay(holder);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			mCamera.startPreview();// 开始预览
		}

		// 预览界面被销毁
		public void surfaceDestroyed(SurfaceHolder holder) {
			System.out.println("surfaceDestroyed");
			if (mCamera != null) {
				mCamera.release();
				mCamera = null;
			}
		}

	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			mPannelController.setVisibility(ViewGroup.VISIBLE);
			return true;
		}
		return super.onTouchEvent(event);
	}

}

界面如下图:


我使用的是新浪微博的分享,首先要登录新浪微博(具体的登录过程这里就不说了,大家都了解的昂)。登录成功后点击开始拍照,拍照完成后将照片保存到手机中然后自动去调用新浪的分享方法。

具体是怎么实现的,看上面贴的源码就知道了。

原文地址:https://www.cnblogs.com/dyllove98/p/3198784.html