前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现后台开启服务默默拍照功能

Android实现后台开启服务默默拍照功能

作者头像
砸漏
发布2020-11-05 14:44:15
1.4K0
发布2020-11-05 14:44:15
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

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

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

资源清单如下:

代码语言:javascript
复制
<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  

服务代码如下:

代码语言:javascript
复制
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; 
} 
} 

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

代码语言:javascript
复制
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后台开启服务默默拍照

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档