最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1、开启服务;2、在不不预览的情况下,进行拍照操作。3、使用AlarmManager进行定时操作。

资源清单如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.yang.testservice"    android:versionCode="1"    android:versionName="1.0" >    <uses-feature android:name="android.hardware.camera" />    <uses-feature android:name="android.hardware.camera.autofocus" />    <uses-permission android:name="android.permission.CAMERA" />    <uses-permission android:name="android.permission.FLASHLIGHT" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-feature android:name="android.hardware.camera.any" />    <uses-sdk        android:minSdkVersion="13"        android:targetSdkVersion="15" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/title_activity_main" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <service android:name="com.yang.service.LocalService" />    </application></manifest>

服务代码如下:

package com.yang.service;import java.io.IOException;import android.app.AlarmManager;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.hardware.Camera;import android.os.Binder;import android.os.IBinder;import android.util.Log;import android.view.SurfaceView;import android.widget.Toast;import com.yang.handle.PhotoHandler;import com.yang.testservice.MainActivity;import com.yang.testservice.R;public class LocalService extends Service {private AlarmManager am = null;private Camera camera;private final IBinder mBinder = new LocalBinder();private NotificationManager mNM;private int NOTIFICATION = R.string.local_service_started;/** * Class for clients to access. Because we know this service always runs in * the same process as its clients, we don't need to deal with IPC. */public class LocalBinder extends Binder {public LocalService getService() {return LocalService.this;}}@Overridepublic void onCreate() {mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);showNotification();init();}private void init() {am = (AlarmManager) getSystemService(ALARM_SERVICE);camera = openFacingBackCamera();// 注册广播IntentFilter filter = new IntentFilter();filter.addAction("com.vegetables_source.alarm");registerReceiver(alarmReceiver, filter);Intent intent = new Intent();intent.setAction("com.vegetables_source.alarm");PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),1000 * 10, pi);// 马上开始,每1分钟触发一次}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("LocalService", "Received start id " + startId + ": " + intent);return START_STICKY;}@Overridepublic void onDestroy() {mNM.cancel(NOTIFICATION);cancelAlertManager();if (camera != null) {camera.release();camera = null;}Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();}@Overridepublic IBinder onBind(Intent intent) {return mBinder;}/** * Show a notification while this service is running. */private void showNotification() {CharSequence text = getText(R.string.local_service_started);Notification notification = new Notification(R.drawable.stat_running,text, System.currentTimeMillis());PendingIntent contentIntent = PendingIntent.getActivity(this, 0,new Intent(this, MainActivity.class), 0);notification.setLatestEventInfo(this,getText(R.string.local_service_label), text, contentIntent);mNM.notify(NOTIFICATION, notification);}private void cancelAlertManager() {Intent intent = new Intent();intent.setAction("com.vegetables_source.alarm");PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0);am.cancel(pi);// 注销广播unregisterReceiver(alarmReceiver);}BroadcastReceiver alarmReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if ("com.vegetables_source.alarm".equals(intent.getAction())) {if (camera != null) {SurfaceView dummy = new SurfaceView(getBaseContext());try {camera.setPreviewDisplay(dummy.getHolder());} catch (IOException e) {e.printStackTrace();}camera.startPreview();camera.takePicture(null, null, new PhotoHandler(getApplicationContext()));}}}};private Camera openFacingBackCamera() {Camera cam = null;Camera.CameraInfo cameraInfo = new Camera.CameraInfo();;for (int camIdx = 0, cameraCount = Camera.getNumberOfCameras(); camIdx < cameraCount; camIdx++) {Camera.getCameraInfo(camIdx, cameraInfo);if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {try {cam = Camera.open(camIdx);} catch (RuntimeException e) {e.printStackTrace();}}}return cam;}}


进行拍照存储的操作代码如下:

package com.yang.handle;import java.io.File;import java.io.FileOutputStream;import java.text.SimpleDateFormat;import java.util.Date;import android.content.Context;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.os.Environment;import android.widget.Toast;public class PhotoHandler implements PictureCallback {    private final Context context;    public PhotoHandler(Context context) {        this.context = context;    }    @Override    public void onPictureTaken(byte[] data, Camera camera) {        File pictureFileDir = getDir();        if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {            Toast.makeText(context, "Can't create directory to save image.",                    Toast.LENGTH_LONG).show();            return;        }        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");        String date = dateFormat.format(new Date());        String photoFile = "Picture_" + date + ".jpg";        String filename = pictureFileDir.getPath() + File.separator + photoFile;        File pictureFile = new File(filename);        System.out.println("filename is "+ filename);        try {            FileOutputStream fos = new FileOutputStream(pictureFile);            fos.write(data);            fos.close();            Toast.makeText(context, "New Image saved:" + photoFile,                    Toast.LENGTH_LONG).show();        } catch (Exception error) {            Toast.makeText(context, "Image could not be saved.",                    Toast.LENGTH_LONG).show();        }    }    private File getDir() {        File sdDir = Environment          .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);        return new File(sdDir, "ServiceCamera");    }}

项目代码如下:

http://download.csdn.net/detail/yangzl2008/5714383





更多相关文章

  1. lobiner 关于android中的sqlite数据库操作
  2. android电话窃听器(示例代码)
  3. android 简单的相册查看器
  4. android之AsyncQueryHandler详解
  5. android有用代码片段(一)
  6. Android实现快递物流时间轴效果
  7. Android中图像变换Matrix的原理、代码验证和应用(二)
  8. ROOT android 原则。 基于(zergRush)
  9. Android(安卓)Telephony主要模块及功能

随机推荐

  1. 在Android程序中使用MQTT
  2. Android Studio 插件之 Android ButterKn
  3. 如何使用Android(安卓)Studio把自己的And
  4. Android 之 自定义标签 和 自定义组件
  5. Android(安卓)利用soap协议与服务端进行
  6. Android在标准linux基础上对休眠唤醒的实
  7. Android数据持久化
  8. android 动画AnimationSet 和 AnimatorSe
  9. 访问自己创建的Contentprovider 抛异常
  10. android application学习之三