使用觸屏手機的人都有過這樣的一種錯誤:在撥號的時候觸錯了人,一步小心就呼叫出去了,這個時候手忙腳亂的去掛斷。那麼針對上面的情景設計,我做了這麼一個小的練習,就是說當要撥打到電話的時候,首先彈出一個對話方塊,確認要撥打給電話XXX,點確認以後呼叫,點取消以後取消呼叫。
先:
因為是一次自學聯絡,所以功能上並不複雜,但是個人有發現有這樣的app在市面上流通,所以做一個對別人有用的練習,還是很有成就感的。下面提出主要的代碼
[java]
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.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);
}
}
[html]
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;
@Override
public 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(){
}
}
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;
@Override
public 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(){
}
}
[html]
<?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>
<?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、由使用簡單頁面跳轉到了使用一些比較系統的介面,感覺到可以控制機器了。
附上原始碼
摘自 技術專欄