【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)后臺(tái)開啟服務(wù)默默拍照功能_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)后臺(tái)開啟服務(wù)默默拍照功能_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)后臺(tái)開啟服務(wù)默默拍照功能_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)后臺(tái)開啟服務(wù)默默拍照功能_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)后臺(tái)開啟服務(wù)默默拍照功能_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android如何實(shí)現(xiàn)后臺(tái)開啟服務(wù)默默拍照功能

這篇文章主要介紹Android如何實(shí)現(xiàn)后臺(tái)開啟服務(wù)默默拍照功能,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!具體內(nèi)容如下最近項(xiàng)目原因,需要編寫一后臺(tái)運(yùn)行的程序,在給定時(shí)間間隔下進(jìn)行拍照,關(guān)鍵技術(shù)主要是:1、開啟服務(wù);2、在不不預(yù)覽的情況下,進(jìn)行拍照操作。3、使用AlarmManager進(jìn)行定時(shí)操作。資源清單如下:<manifest

xmlns:android="/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="ent.action.MAIN"

/>

<category

android:name="ent.category.LAUNCHER"

/>

</intent-filter>

</activity>

<service

android:name="com.yang.service.LocalService"

/>

</application>

</manifest>服務(wù)代碼如下: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();

//

注冊(cè)廣播

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分鐘觸發(fā)一次

}

@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;

}

}進(jìn)行拍照存儲(chǔ)的操作代碼如下: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

=

"P

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論