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

    界面如下图:


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

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

  • 相关阅读:
    16、springboot——错误处理原理+定制错误页面(1)
    15、springboot——CRUD-跳转到修改员工页面+员工修改和删除实现 ⑥
    14、springboot——CRUD-跳转到添加员工页面+员工添加实现⑤
    13、springboot——CRUD-thymeleaf公共页面元素抽取④
    12、springboot——CRUD登录和拦截③
    11、springboot——CRUD国际化②
    10、springboot——CRUD导入静态资源以及设置默认访问首页①
    9、springmvc的自动配置
    8、模板引擎thymeleaf(百里香叶)
    7、对静态资源映射的规则
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3198784.html
Copyright © 2020-2023  润新知