中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android如何實現后臺開啟服務默默拍照功能

發布時間:2021-04-17 09:57:33 來源:億速云 閱讀:193 作者:小新 欄目:移動開發

這篇文章主要介紹Android如何實現后臺開啟服務默默拍照功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

具體內容如下

最近項目原因,需要編寫一后臺運行的程序,在給定時間間隔下進行拍照,關鍵技術主要是: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-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>

服務代碼如下:

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如何實現后臺開啟服務默默拍照功能”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

花莲市| 霍山县| 策勒县| 中阳县| 江山市| 长春市| 宁陕县| 正安县| 四平市| 楚雄市| 镇江市| 来宾市| 石家庄市| 信丰县| 澳门| 平凉市| 明溪县| 银川市| 东乡| 敦化市| 凤山市| 顺平县| 卢龙县| 丹阳市| 仪征市| 长海县| 乌海市| 青河县| 韶山市| 和林格尔县| 和田县| 望城县| 突泉县| 边坝县| 盐城市| 新疆| 乌苏市| 邳州市| 秦安县| 齐齐哈尔市| 惠水县|