189 8069 5689

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

这篇文章主要介绍Android如何实现后台开启服务默默拍照功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

公司主营业务:网站设计制作、网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出武安免费做网站回馈大家。

具体内容如下

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

资源清单如下:

 
 
  
  
 
  
  
  
 
  
 
  
 
  
   
    
     
 
     
    
   
 
   
  
 

服务代码如下:

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如何实现后台开启服务默默拍照功能
文章URL:http://cdxtjz.cn/article/jedepp.html

其他资讯