




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山茶油訂購合同協(xié)議書
- 道路共建協(xié)議書
- 邵昕離婚協(xié)議書
- 美伊退出協(xié)議書
- 酒店受傷協(xié)議書
- 酒店分成協(xié)議書
- 維護(hù)婚姻協(xié)議書
- 注冊(cè)類人員引薦協(xié)議書
- 良田流轉(zhuǎn)協(xié)議書
- 礦石交易協(xié)議書
- (完整版)英語四級(jí)詞匯表
- 廣告費(fèi)合同模板
- 第五單元 探索1 互聯(lián)網(wǎng)安全風(fēng)險(xiǎn)及其產(chǎn)生原因教學(xué)設(shè)計(jì)-2023-2024學(xué)年蘇科版(2023)初中信息科技七年級(jí)下冊(cè)
- 廣西壯族自治區(qū)2024年普通高中學(xué)業(yè)水平選擇性考?xì)v史試題(含答案)
- 心理健康專題課件25心理健康
- 口腔癌護(hù)理個(gè)案
- 【生物】魚課件+2024-2025學(xué)年人教版生物七年級(jí)上冊(cè)
- 文化行業(yè)標(biāo)準(zhǔn) WH-T 92-2021 臨時(shí)搭建演出場所舞臺(tái)、看臺(tái)安全監(jiān)督檢驗(yàn)規(guī)范
- 慢性乙型肝炎防治指南(2022年版)
- NB-T+31010-2019陸上風(fēng)電場工程概算定額
- DZ∕T 0450-2023 地質(zhì)災(zāi)害監(jiān)測數(shù)據(jù)通信技術(shù)要求(正式版)
評(píng)論
0/150
提交評(píng)論