android電話源碼
1. Android中怎麼判斷撥打和接聽電話是否接通
android源碼裡面是有以下狀態的:
IDLE,//待機,沒有連接
ACTIVE,//通話
HOLDING,//掛斷通話
DIALING,//響鈴
ALERTING,//提醒
INCOMING,//來電
2. android怎麼實現自動接聽和掛斷電話功能
android 實現來電自動接聽和自動掛斷的方法:
第一步:准備應用環境需要的系統包和aidl文件。
(1)在應用中創建包:android.telephony
將android系統框架下的\framework\telephony\java\android\telephony目錄中的NeighboringCellInfo.aidl文件復制到上面創建的包(android.telephony )中;
(2)在應用中創建包:com.android.internal.telephony
將android系統框架下的\framework\telephony\java\com\android\internal\telephony目錄中的ITelephony.aidl文件復制到上面創建的包(com.android.internal.telephony )中。
第二步:創建一個獲取ITelephony的方法
PhoneUtils.java
package com.zhouzijing.android.demo;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.telephony.TelephonyManager;
public class PhoneUtils {
/**
* 根據傳入的TelephonyManager來取得系統的ITelephony實例.
* @param telephony
* @return 系統的ITelephony實例
* @throws Exception
*/
public static ITelephony getITelephony(TelephonyManager telephony) throws Exception {
Method getITelephonyMethod = telephony.getClass().getDeclaredMethod("getITelephony");
getITelephonyMethod.setAccessible(true);//私有化函數也能使用
return (ITelephony)getITelephonyMethod.invoke(telephony);
}
}
第三步:創建電話廣播攔截器
MyPhoneBroadcastReceiver.java
package com.zhouzijing.android.demo;
import com.android.internal.telephony.ITelephony;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.util.Log;
public class MyPhoneBroadcastReceiver extends BroadcastReceiver {
private final static String TAG = MyPhone.TAG;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "[Broadcast]"+action);
//呼入電話
if(action.equals(MyPhone.B_PHONE_STATE)){
Log.i(TAG, "[Broadcast]PHONE_STATE");
doReceivePhone(context,intent);
}
}
/**
* 處理電話廣播.
* @param context
* @param intent
*/
public void doReceivePhone(Context context, Intent intent) {
String phoneNumber = intent.getStringExtra(
TelephonyManager.EXTRA_INCOMING_NUMBER);
TelephonyManager telephony = (TelephonyManager)context.getSystemService(
Context.TELEPHONY_SERVICE);
int state = telephony.getCallState();
switch(state){
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG, "[Broadcast]等待接電話="+phoneNumber);
try {
ITelephony iTelephony = PhoneUtils.getITelephony(telephony);
iTelephony.answerRingingCall();//自動接通電話
//iTelephony.endCall();//自動掛斷電話
} catch (Exception e) {
Log.e(TAG, "[Broadcast]Exception="+e.getMessage(), e);
}
break;
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG, "[Broadcast]電話掛斷="+phoneNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG, "[Broadcast]通話中="+phoneNumber);
break;
}
}
}
第四部:注冊電話廣播攔截器
MyPhone.java
package com.zhouzijing.android.demo;
import android.app.Activity;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
public class MyPhone extends Activity {
public final static String TAG = "MyPhone";
public final static String B_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED;
private MyPhoneBroadcastReceiver mBroadcastReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_phone);
}
//按鈕1-注冊廣播
public void registerThis(View v) {
Log.i(TAG, "registerThis");
mBroadcastReceiver = new MyPhoneBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(B_PHONE_STATE);
intentFilter.setPriority(Integer.MAX_VALUE);
registerReceiver(mBroadcastReceiver, intentFilter);
}
//按鈕2-撤銷廣播
public void unregisterThis(View v) {
Log.i(TAG, "unregisterThis");
unregisterReceiver(mBroadcastReceiver);
}
}
第5步:在AndroidManifest.xml配置許可權
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE"/>
其中:
iTelephony.answerRingingCall();//自動接通電話
必須有許可權 android.permission.MODIFY_PHONE_STATE
iTelephony.endCall();//自動掛斷電話
必須有許可權 android.permission.CALL_PHONE。
3. 怎樣查看 Android APP 源代碼
需要把反編譯的apk存放到apktools同級文件夾目錄下,然後運行要查看的安裝包,具體操作如下:
1、首先把反編譯的apk存放到apktools同級文件夾目錄下,如下圖所示。
4. 鎬庢牱鏌ョ湅 Android APP婧愪唬鐮
瑕佹煡鐪婣ndroid APP鐨勬簮浠g爜錛屼綘鍙浠ラ氳繃浠ヤ笅鍑犵嶆柟娉曪細
1. 浠庡紑婧愬鉤鍙拌幏鍙栵細濡傛灉APP鏄寮婧愮殑錛屼綘鍙浠ュ湪濡侴itHub銆丟itLab絳変唬鐮佹墭綆″鉤鍙頒笂鎼滅儲璇APP鐨勬簮浠g爜銆
2. 浣跨敤鍙嶇紪璇戝伐鍏鳳細瀵逛簬闈炲紑婧愮殑APP錛屼綘鍙浠ュ皾璇曚嬌鐢ㄥ弽緙栬瘧宸ュ叿濡侫pktool鍜孞D-GUI鏉ュ弽緙栬瘧APK鏂囦歡銆傝繖浜涘伐鍏峰彲浠ュ皢APK鏂囦歡杞鎹涓哄彲璇葷殑婧愪唬鐮佸艦寮忥紝浣嗚鋒敞鎰忥紝鍙嶇紪璇戝緱鍒扮殑浠g爜鍙鑳戒笉瀹屽叏絳夊悓浜庡師濮嬫簮浠g爜錛屼笖鍙鑳藉寘鍚緙栬瘧鍜屼紭鍖栧悗鐨勪唬鐮併
3. 鍒╃敤璋冭瘯宸ュ叿錛氬傛灉浣犳嫢鏈堿PP鐨凙PK鏂囦歡錛屽苟涓斿笇鏈涘湪榪愯屾椂鏌ョ湅婧愪唬鐮侊紝浣犲彲浠ヤ嬌鐢ˋndroid Studio鐨勮皟璇曞姛鑳姐傞氳繃璋冭瘯錛屼綘鍙浠ュ湪APP榪愯屾椂鏌ョ湅鍜屼慨鏀逛唬鐮侊紝浣嗚繖闇瑕佷竴瀹氱殑緙栫▼鐭ヨ瘑鍜岀粡楠屻
4. 鑱旂郴寮鍙戣咃細濡傛灉浣犲規煇涓獮PP鐨勬簮浠g爜鎰熷叴瓚o紝浣嗘棤娉曢氳繃浠ヤ笂鏂規硶鑾峰彇錛屼綘鍙浠ュ皾璇曡仈緋誨紑鍙戣呮垨寮鍙戝洟闃燂紝璇㈤棶浠栦滑鏄鍚︽効鎰忓垎浜婧愪唬鐮併傛湁浜涘紑鍙戣呭彲鑳戒細鎰挎剰鍒嗕韓浠栦滑鐨勪唬鐮侊紝鐗瑰埆鏄瀵逛簬閭d簺鏁欒偛鎴栫爺絀剁洰鐨勭殑璇鋒眰銆
鍦ㄦ煡鐪婣ndroid APP婧愪唬鐮佹椂錛岃風『淇濅綘閬靛畧鐩稿叧鐨勬硶寰嬪拰閬撳痙瑙勮寖銆傛湭緇忚稿彲鐨勮幏鍙栧拰浣跨敤浠栦漢鐨勬簮浠g爜鍙鑳戒鏡鐘鐭ヨ瘑浜ф潈錛屽洜姝よ風『淇濅綘鐨勮屼負鍚堟硶鍚堣勩傚悓鏃訛紝浜嗚В婧愪唬鐮佸苟涓嶆剰鍛崇潃浣犲彲浠ラ殢鎰忎慨鏀瑰拰鍒嗗彂APP錛岄櫎闈炰綘鑾峰緱浜嗗紑鍙戣呯殑鏄庣『鎺堟潈銆
鎬諱箣錛屾煡鐪婣ndroid APP婧愪唬鐮佺殑鏂規硶鍥燗PP鐨勫紑婧愭儏鍐佃屽紓銆傚逛簬寮婧怉PP錛屼綘鍙浠ョ洿鎺ヤ粠浠g爜鎵樼″鉤鍙拌幏鍙栨簮浠g爜錛涘逛簬闈炲紑婧怉PP錛屼綘鍙浠ュ皾璇曚嬌鐢ㄥ弽緙栬瘧宸ュ叿鎴栬皟璇曞伐鍏鋒潵鏌ョ湅婧愪唬鐮侊紱褰撶劧錛屼綘涔熷彲浠ヨ仈緋誨紑鍙戣呭繪眰甯鍔┿傛棤璁洪噰鐢ㄥ摢縐嶆柟娉曪紝閮借風『淇濅綘鐨勮屼負鍚堟硶鍚堣勶紝騫跺皧閲嶄粬浜虹殑鐭ヨ瘑浜ф潈銆
5. Android源碼問題,撥打完電話會更新通話記錄列表,通過一個監聽來實現查詢CallLogProvider,有了解的嗎
可以根據Uri來反向查找調用者!
6. 怎樣查看 Android APP源代碼
將apk文件拷貝至sdcard上。
命令順序如下:
進入Android sdk文件夾/tools目錄下
輸入adb shell
輸入su
輸入cd data
輸入cd app
這時就可以看到你安裝的所有的apk文件。輸入cp 空格 對應的apk 空格 /sdcard/
這樣就將apk文件拷貝出來了。
將apk文件後綴直接變成rar格式,可以看到熟悉的目錄結構了,
其中xml文件打開後都是二進制的,無法查看。
這時就用到了一個android4me的AXMLPrinter2工具。(請自行網路搜索)
輸入以下命令,將xml文件解析出來
java -jar AXMLPrinter2.jar showtimes_list.xml
此命令是在命令行中查看此showtimes_list.xml
將showtimes_list.xml生成xml文件,則輸入以下命令:
java -jar AXMLPrinter2.jar showtimes_list.xml > h.xml
目前進行到這一步,只能看到xml文件的內容,其工程中的java源文件還是看不到,看目錄結構下有一個classes.dex文件,我們需要將dex文件變為jar文件。
這里用到了另一個工具dex2jar。(自行搜索下載)
在Windows下解壓之後的目錄如下圖所示:
在命令行中,進入到此目錄下:
在Windows下,輸入以下命令:
dex2jar.bat c:classes.dex
運行完之後,在C盤會多一個classes.dex.dex2jar.jar文件,此文件就是我們需要的jar文件。
利用jd-gui,將jar文件反向工程為java代碼。(請自行搜索下載)
它分為Windows、Linux、和max三個版本,這里我下載的是Windows版本的。
解壓之後,雙擊運行exe文件,選擇classes.dex.dex2jar.jar文件,相應的jar文件中的Java文件就被反向工程顯示出來了!
7. Android開發,如何編程實現開啟電話的免提功能
JAVA編寫,對應撥打電話只需要調用ACTION_CALL加對應電話號碼可以如下編寫:
viewplain
voidcallPhone(){
Intentintent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:110"));//不能調用呼叫
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
但是當撥打110,119,120等緊急電話時,無法自動呼出,還需要用戶進行確認操作,那麼就需要實現直接進行呼叫,但是前提app必須用系統級別許可權,及system/app/目錄下方可。
首先確保應用具有如下許可權:
viewplain
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<uses-permissionandroid:name="android.permission.CALL_PHONE"/>
<uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permissionandroid:name="android.permission.CALL_PRIVILEGED"/>
同樣調用intent來開啟功能,不過內容有些變化
viewplain
voidcallPhone(Stringnum){
Intentintent=newIntent("android.intent.action.CALL_PRIVILEGED",Uri.parse("tel:"+num));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
然後在源碼下編譯,放到/system/app/即可使用。
開啟撥通電話後設置開啟揚聲器功能:
首先,獲取音頻管理器:audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
設置電話監聽:
viewplain
{
booleancomingPhone=false;
@Override
publicvoidonCallStateChanged(intstate,StringincomingNumber){
switch(state){
caseTelephonyManager.CALL_STATE_IDLE:/*無任何狀態*/
Log.d(tag,"phoneidle");
if(this.comingPhone){
this.comingPhone=false;
backMyApp();
setSpeekModle(false);
}
break;
caseTelephonyManager.CALL_STATE_OFFHOOK:/*接起電話*/
Log.d(tag,"phoneanswer");
this.comingPhone=true;
setSpeekModle(true);
break;
caseTelephonyManager.CALL_STATE_RINGING:/*電話進來*/
Log.d(tag,"phonecoming");
this.comingPhone=true;
setSpeekModle(true);
break;
}
}
}
注冊監聽類:
viewplain
TelephonyManagertelManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
TelListnerlistener=newTelListner();
telManager.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
開啟或關閉免提功能:
viewplain
voidsetSpeekModle(booleanopen){
//audioManager.setMode(AudioManager.ROUTE_SPEAKER);
currVolume=audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
audioManager.setMode(AudioManager.MODE_IN_CALL);
if(!audioManager.isSpeakerphoneOn()&&true==open){
audioManager.setSpeakerphoneOn(true);
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,
audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL),
AudioManager.STREAM_VOICE_CALL);
}elseif(audioManager.isSpeakerphoneOn()&&false==open){
audioManager.setSpeakerphoneOn(false);
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,currVolume,
AudioManager.STREAM_VOICE_CALL);
}
}
添加許可權:
viewplain
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<uses-permissionandroid:name="android.permission.MODIFY_AUDIO_SETTINGS"/>