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"/>