最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是: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-sdkandroid:minSdkVersion="13"android:targetSdkVersion="15" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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;}@Overridepublic 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

Android后台开启服务默默拍照相关推荐

  1. android 后台服务拍照,Android实现后台开启服务默默拍照功能

    本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预 ...

  2. android 后台自动拍照,Android实现后台开启服务默默拍照功能

    本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预 ...

  3. Android混合方式开启服务,百度音乐盒

    一.混合方式开启服务 需求:既想让服务在后台长期运行,又想调用服务里面的方法 1.先调用 startService 方法开启服务,能保证服务在后台长期运行 2.调用 bindService 方法,获取 ...

  4. android adb开启服务,android adb 启动activity、service,发送broadcast等操作

    android adb 启动activity.service,发送broadcast等操作 图片发自简书App 一.adb启动activity: adb shellam start -n {包(pac ...

  5. android 后台运行service实现和后台的持续交互

    在项目中有这么一种需求 需要后台开启服务,时刻记录用户和软件的交互行为,一旦交互发生,就向服务器测发送一条消息 解决方案: 一.创建一个service服务类 在service中开启一个线程,servi ...

  6. Android后台服务Service

    后台服务 桌面应用程序:可见 服务:不可见  长期在后台运行 帮助应用执行耗时的操作 安卓的服务:安卓四大组件之一  不可见   后台长期运行 界面与服务有时候要执行数据交互 如何创建服务: 1. 创 ...

  7. android开启服务应用禁止被杀死,Android Service服务如何不被杀死

    第一章 Service介绍 service服务是一个应用程序的四大组件之一,可以再后台执行长时间运行的操作,不提供用户界面.一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切到另一个应用 ...

  8. Android——后台服务

    Android应用编程实验 实验名称:Android 后台服务 实验目的:通过Service设计后台服务程序,通过Broadcast实现信息广播机制 实验内容: 设计一个简单的后台音乐服务程序: 设计 ...

  9. Android 系统(215)---Android O_GO后台启动服务改动

    Android O_GO后台启动服务改动 Android O_GO后台启动服务改动 1. 问题现象 应用在适配Android O/GO的系统时,会发现后台启动不了服务,会报出如下异常,并强退: jav ...

最新文章

  1. ASP.NET中在线用户统计
  2. html 文本溢出,确定HTML元素的内容是否溢出
  3. 你以为工厂模式很简单,可能是因为你懂的只是冰山的一角
  4. 81-linux cluster : lvs
  5. Linux系统管理(10)——Centos8 重启网络服务 网络相关命令
  6. 在OpenGL中使用FreeImage库生成纹理
  7. 停车场管理系统项目计划书
  8. 基于CAA的CATIA二次开发环境搭建全过程(亲测可用)
  9. windows配置代理
  10. 地下城与勇士鬼剑士觉醒java_地下城与勇士之鬼剑士觉醒单机版
  11. MATLAB|用循环描点画波形图
  12. Eclipse 恢复误删jar包
  13. 【一月一本技术书】-【Go语言设计与实现】- 9月
  14. 这可能是全网最简单的KMP了
  15. 基于单片机的八路电压检测系统设计(#0427)
  16. 33、【华为HCIE-Storage】--文件系统配额(quota tree)
  17. 使用scihub2pdf,在scihub通过doi批量下载文献pdf格式
  18. vue中将 后台返回的0,1等 代码转换成 男,女等汉字。
  19. 解决web前端高分辨率电视(4K)适配问题
  20. 倒计时1个月,不注册就停售,亚马逊EPR新规即将生效

热门文章

  1. 小学信息技术用计算机画画说课,小学信息技术说课稿三篇
  2. 软件测试【每日一题20220913】面包师皮特
  3. 找不到匹配的host key算法
  4. 疯狂模渲大师|什么是室内设计?是免费设计吗?
  5. 4年后Hadoop的再回首
  6. 杀死O2O的三大杀手?!
  7. LeetCode(6)-Python-Z 字形变换(zigzag-conversion)
  8. 基于RocketMQ设计秒杀
  9. swagger页面不显示_Swagger字段属性说明不显示
  10. XP系统如何连接Win10共享打印机--win10专业版