最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

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

IT圈 admin 31浏览 0评论

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

本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下

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

资源清单如下:

package="com.yang.testservice"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="13"

android:targetSdkVersion="15" />

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name=".MainActivity"

android:label="@string/title_activity_main" >

服务代码如下:

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;

}

}

@Override

public 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分钟触发一次

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.i("LocalService", "Received start id " + startId + ": " + intent);

return START_STICKY;

}

@Override

public 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();

}

@Override

public 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() {

@Override

public 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");

}

}

项目代码如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下

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

资源清单如下:

package="com.yang.testservice"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="13"

android:targetSdkVersion="15" />

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name=".MainActivity"

android:label="@string/title_activity_main" >

服务代码如下:

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;

}

}

@Override

public 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分钟触发一次

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

Log.i("LocalService", "Received start id " + startId + ": " + intent);

return START_STICKY;

}

@Override

public 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();

}

@Override

public 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() {

@Override

public 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");

}

}

项目代码如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

发布评论

评论列表 (0)

  1. 暂无评论