使用觸屏手機的人都有過這樣的一種錯誤:在撥號的時候觸錯了人,一步小心就呼叫出去了,這個時候手忙腳亂的去掛斷。那麼針對上面的情景設計,我做了這麼一個小的練習,就是說當要撥打到電話的時候,首先彈出一個對話方塊,確認要撥打給電話XXX,點確認以後呼叫,點取消以後取消呼叫。
先:
因為是一次自學聯絡,所以功能上並不複雜,但是個人有發現有這樣的app在市面上流通,所以做一個對別人有用的練習,還是很有成就感的。下面提出主要的代碼
package abortCall.test;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.SharedPreferences;import android.content.DialogInterface.OnClickListener;import android.content.Intent;import android.net.Uri;import android.os.Bundle;public class AbortCallActivity extends Activity { /** Called when the activity is first created. */String nums =""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try{ Bundle bundle = this.getIntent().getExtras(); nums = bundle.getString("num"); ShowDialog(); }catch(Exception ex){ } } private void ShowDialog(){AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setMessage("您確定要撥號給"+nums+"嗎?");builder.setTitle("提醒");builder.setPositiveButton("確定", new OnClickListener(){public void onClick(DialogInterface dialog,int which){SharedPreferences settings = getSharedPreferences("SETTING_INFO",0);settings.edit().putBoolean("IsAllowed", true).commit();Intent intent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+nums)); startActivity(intent);Finish();}});builder.setNegativeButton("取消", new OnClickListener(){public void onClick(DialogInterface dialog,int which){Finish();}});builder.create().show();} private void Finish(){ this.finish(); System.exit(0); }}
package abortCall.test;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;public class callReceiver extends BroadcastReceiver {private Context context;@Overridepublic void onReceive(Context context, Intent intent){String action = intent.getAction();String PhoneNum = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);this.context = context;SharedPreferences settings = context.getSharedPreferences("SETTING_INFO",0);boolean IsAllowed = settings.getBoolean("IsAllowed",false);if(!IsAllowed){setResultData(null);intent.setClass(context, AbortCallActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra("num", PhoneNum);context.startActivity(intent);}settings.edit().putBoolean("IsAllowed", false).commit();this.clearAbortBroadcast();}public void Allowed(){}}
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="abortCall.test" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> <uses-permission android:name="android.permission.CALL_PHONE"/><application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".AbortCallActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="callReceiver"> <intent-filter android:priority="-1" > <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> </application></manifest>
主要的思路:在手機撥號的時候獲得android.permission.PROCESS_OUTGOING_CALLS 的Broadcast事件,然後對阻斷撥號,並且跳轉到Activity.由Activity彈出對話方塊。經過對話方塊確認以後,再次撥號。因為再次撥號依然會被阻斷,所以想可以傳遞一個參數給Receiver告訴它這次撥號是經過許可的。就不會阻斷,因為無法直接傳遞參數,所以使用了一個SharedPreferences來儲存傳遞值。從而避免再次被阻斷。
通過本次聯絡主要掌握的知識點:
1、如何註冊和使用一個BroadCastReceiver.
2、BroadCastReceiver如何啟用一個Activity:要點是intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
3、BroadcastReceiver無法直接啟動一個Dialog
4、如何使用一個Dialog
5、如何在系統無法支援明確傳遞參數的情況下去傳遞一個參數,使用SharedPreferres去傳遞參數,做到靈活應用和變通。
6、如何阻斷撥號和播出去一個號碼。
7、由使用簡單頁面跳轉到了使用一些比較系統的介面,感覺到可以控制機器了。
附上原始碼 http://download.csdn.net/detail/aofengdaxia/4058274