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实现后台开启服务默默拍照功能相关推荐
- 7开启uasp协议_Dubbo-go 源码笔记(一)Server 端开启服务过程
导读:随着微服务架构的流行,许多高性能 rpc 框架应运而生,由阿里开源的 dubbo 框架 go 语言版本的 dubbo-go 也成为了众多开发者不错的选择.本文将介绍 dubbo-go 框架的基本 ...
- Android后台开启服务默默拍照
最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预览的情况下,进行拍照操作.3.使用AlarmManager进行定时操作. 资源清单如下: & ...
- android 后台自动拍照,Android实现后台开启服务默默拍照功能
本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预 ...
- android 后台自动拍照,怎么实现后台拍照功能,求解
如何实现后台拍照功能,求解. 自己去网上找了一段后台拍照代码,如: MainActivity.java就实现一个按钮启动一个服务 public void click(View v) { bindSer ...
- android远程控制(三)----通过后台服务实现系统点击事件模拟
整合后台服务和驱动代码注入 Home键的驱动代码: /dev/input/event1: 0001 0066 00000001 /dev/input/event1: 0000 0000 0000000 ...
- 如何检查后台服务(Android的Service类)是否正在运行?
描述: 如何检查后台服务(Android的Service类)是否正在运行?我希望我的Activity能够显示Service的状态,然后我可以打开或者关闭它. 回答: Android系统提供了一个函数A ...
- android 8.0手机开服务端,Android 8.0 + Service开启方式兼容处理
Android 8.0 + ,对后台服务进行了限制了.如果依然采用之前startService()方式. 会导致问题. 前后台服务的一些区别: 有人可能会问,后台服务我们可以自己创建 ONGOING ...
- android 后台运行service实现和后台的持续交互
在项目中有这么一种需求 需要后台开启服务,时刻记录用户和软件的交互行为,一旦交互发生,就向服务器测发送一条消息 解决方案: 一.创建一个service服务类 在service中开启一个线程,servi ...
- android开启服务应用禁止被杀死,Android Service服务如何不被杀死
第一章 Service介绍 service服务是一个应用程序的四大组件之一,可以再后台执行长时间运行的操作,不提供用户界面.一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切到另一个应用 ...
最新文章
- mysql 业务账户_mysql的事务
- React Native开发环境搭建记录
- Linux下的Backlight子系统
- JDK 13:VM.events已添加到jcmd
- Windiws环境安装轻量级文件服务器ftpserver
- 常用原生js自定义函数
- nginx php7 fastcgi,[Mac php7 nginx]解决nginx FastCGI sent in stderr: “Primary script unknown”
- 用java swing做连连看_java基于swing实现的连连看代码
- 英特尔宣布推出锐炫 A 系列移动端独立显卡
- mysql5.7 非gtid同步
- Windows server 2003网络服务之搭建服务器群集
- 嵌入式系统硬件原理设计与审核
- VIM空格和TAB转换
- c/c++中与字符串处理相关的函数
- java创建ssh链接池_HttpClient实战三:Spring整合HttpClient连接池
- Gameplay - 多人游戏关卡设计
- 傅里叶变换的性质(一)
- 避免我们的邮件服务器发出的邮件被当成垃圾邮件
- 文件夹里子文件夹快速重命名编号技巧
- 2022-2028年全球与中国单过硫酸氢钾行业市场需求预测分析
热门文章
- R语言ggplot2可视化:ggplot2可视化直方图(histogram)并在直方图的顶部外侧(top upper)或者直方图内部添加数值标签
- R语言应用calibrate包的textxy函数向R原生绘图结果中添加文本标签:添加多个文本标签、改变文本标签的字体、改变文本标签的字体颜色
- R语言删除包含缺失值的行并将字符数据列(character)转化为因子列(factor)实战
- R语言ggplot2可视化对图形进行纹理填充实战及启示:遇到问题首先去思考有没有现成的包(ggpattern)可以去解决这个问题
- R语言构建xgboost模型:基于叶子索引衍生出新的特征并进行独热编码(one-hot encoding)之后构建新的模型、比较加入叶子索引特征的模型的分类性能提升
- 梯度下降回归SGDRegressor、岭回归(Ridge)和套索(Lasso)回归、套索最小角回归、ElasticNet回归、正交匹配追踪回归
- 使用keras构建LSTM分类器
- [Google API](1)简介
- 不用在读长和准确性之间做选择题,PacBio发表新方法
- The impact of third generation genomic technologies on plant genome assembly 第三代基因组技术对植物基因组组装的影响