博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android 定时拍照并发送微博
阅读量:6911 次
发布时间:2019-06-27

本文共 8187 字,大约阅读时间需要 27 分钟。

最近在做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);	}}

界面如下图:

 

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

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

 

你可能感兴趣的文章
Windows Server 2012安装选项、界面等级详解
查看>>
把Lumia 610C作为3G路由器
查看>>
Exchange 2010与Exchange Online混合部署PART 4:混合部署
查看>>
让域控制器强制向DNS服务器注册SRV记录
查看>>
Dalvik虚拟机的运行过程分析
查看>>
docker集群存储软件etcd安装
查看>>
技术面试备忘录,饭可以乱吃,话不能乱说!
查看>>
Oracle ASM实例同filesystem间的文件传输
查看>>
两种快速打造App的方法
查看>>
数据仓库入门(实验9)查询多维数据集
查看>>
linux find命令详解
查看>>
通过SSH远程连接Cisco设备
查看>>
瑞星与华为共筑自主产权虚拟化安全屏障
查看>>
你有“高大上”,我有“小而美”,存储发展与智能手机是一样一样的啊
查看>>
[转]Memory Management Functions
查看>>
Getting Started with iOS Development
查看>>
程序员第一定律:关于技能与收入
查看>>
刘墉先生说过一句话
查看>>
SqlServer数据库几种字段类型对比
查看>>
怎样花两年时间去面试一个人
查看>>