android實(shí)現(xiàn)定時(shí)拍照并發(fā)送微博功能
最近在做android方面的開發(fā),下面是android自動(dòng)對(duì)焦并拍照的小例子:
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;
// 報(bào)像頭
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);
// 創(chuàng)建 定時(shí)線程 注意不要使用Timer
pool = Executors.newFixedThreadPool(1);
// 預(yù)覽控件
SurfaceView surfaceView = (SurfaceView) this
.findViewById(R.id.surfaceView);
// 設(shè)置參數(shù)
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);
// 拍照前需要對(duì)焦 獲取清析的圖片
mCamera.autoFocus(new AutoFocusCallback() {
// 對(duì)焦結(jié)束
@Override
public void onAutoFocus(boolean success, Camera camera) {
// 對(duì)焦成功
Toast.makeText(MainActivity.this, "對(duì)焦成功 !!",
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;
// 取消任務(wù)
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回調(diào)");
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mIsRunning = false;
if (pool != null) {
pool.shutdownNow();
}
}
// 定時(shí)器
private ExecutorService pool = null;
private boolean mIsRunning = true;
// 定時(shí)任務(wù)
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
// 定時(shí)觸發(fā)拍照方法
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+"測(cè)試分享", 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);
}
}
// 照片回調(diào)
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();
}
}
}
// 預(yù)覽界面回調(diào)
private final class SurfaceCallback implements Callback {
// 預(yù)覽界面被創(chuàng)建
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();// 開始預(yù)覽
}
// 預(yù)覽界面被銷毀
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);
}
}
界面如下圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android實(shí)現(xiàn)定時(shí)拍照功能
- Android使用自定義view在指定時(shí)間內(nèi)勻速畫一條直線的實(shí)例代碼
- Android使用Handler實(shí)現(xiàn)定時(shí)器與倒計(jì)時(shí)器功能
- Android定時(shí)器和倒計(jì)時(shí)實(shí)現(xiàn)淘寶秒殺功能
- Android CountDownTimer實(shí)現(xiàn)定時(shí)器和倒計(jì)時(shí)效果
- android service實(shí)現(xiàn)循環(huán)定時(shí)提醒功能
- android用鬧鐘定時(shí)做http請(qǐng)求推送的解決方案
- Android鬧鐘機(jī)制實(shí)現(xiàn)定時(shí)任務(wù)功能
- Android編程實(shí)現(xiàn)popupwindow定時(shí)消失的方法
- Android中AlarmManager+Notification實(shí)現(xiàn)定時(shí)通知提醒功能
- 詳解Android實(shí)現(xiàn)定時(shí)器的幾種方法
- Android定時(shí)開機(jī)的流程詳解
相關(guān)文章
Kotlin擴(kuò)展函數(shù)及實(shí)現(xiàn)機(jī)制的深入探索
擴(kuò)展函數(shù)與擴(kuò)展屬性的神奇之處在于,可以在不修改原來類的條件下,使用函數(shù)和屬性,表現(xiàn)得就像是屬于這個(gè)類的一樣。下面這篇文章主要給大家介紹了關(guān)于Kotlin擴(kuò)展函數(shù)及實(shí)現(xiàn)機(jī)制的相關(guān)資料,需要的朋友可以參考下2018-06-06
Android利用Sensor實(shí)現(xiàn)傳感器功能
這篇文章主要為大家詳細(xì)介紹了Android利用Sensor實(shí)現(xiàn)傳感器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
android自定義view實(shí)現(xiàn)數(shù)字進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了android自定義view實(shí)現(xiàn)數(shù)字進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android滑動(dòng)動(dòng)態(tài)分頁實(shí)現(xiàn)方法
這篇文章主要介紹了Android滑動(dòng)動(dòng)態(tài)分頁實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)滑動(dòng)動(dòng)態(tài)分頁的操作步驟與核心實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-10-10
Android onSaveInstanceState和onRestoreInstanceState觸發(fā)的時(shí)機(jī)
這篇文章主要介紹了Android onSaveInstanceState和onRestoreInstanceState觸發(fā)的時(shí)機(jī)的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android評(píng)分RationBar控件使用詳解
這篇文章主要為大家詳細(xì)介紹了Android評(píng)分RationBar控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
Android實(shí)現(xiàn)ListView的A-Z字母排序和過濾搜索功能 實(shí)現(xiàn)漢字轉(zhuǎn)成拼音
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)ListView的A-Z字母排序和過濾搜索功能,實(shí)現(xiàn)漢字轉(zhuǎn)成拼音功能2017-06-06
Android Studio升級(jí)3.6 Build窗口出現(xiàn)中文亂碼問題解決方法
這篇文章主要介紹了Android Studio升級(jí)3.6 Build窗口出現(xiàn)中文亂碼問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

