Android撥打電話不彈出系統撥號界面總結


我在網上搜了一下,解決這個問題,有兩種方式:

1.反射調用系統底層方法,並獲取系統權限

   反射調用的代碼如下:

  Class phoneFactoryClass =        Class.forName("com.android.internal.telephony.PhoneFactory");

  Method makeDefaultPhones=phoneFactoryClass.getMethod("makeDefaultPhones",Context.class);

  makeDefaultPhones.invoke(null,context);

  Method getDefaultPhone =    phoneFactoryClass.getMethod("getDefaultPhone");

  Object p = getDefaultPhone.invoke(null);

  Class classCallManager = Class.forName("com.android.internal.telephony.CallManager");

  Object     CallManagerInstance=classCallManager.getDeclaredMethod("getInstance");

  classCallManager.getMethod("registerPhone", Object.class).invoke(CallManagerInstance, p);

  Method newGetDefaultPhone =classCallManager.getMethod("getDefaultPhone");

  Object phone=newGetDefaultPhone.invoke(CallManagerInstance);

  String phoneName = "com.android.internal.telephony.Phone";

  Class phoneClass = Class.forName(phoneName);

  phoneClass.getMethod("dial", String.class).invoke(phone, number);

 

 

正常調用的思路:

PhoneFactory.makeDefaultPhones(context);

Phone p = PhoneFactory.getDefaultPhone();

CallManager cm = CallManager.getInstance();

cm.registerPhone(p);

Phone phone = cm.getDefaultPhone();

phone.dial(number);

 

 

代碼寫完了之后,還需要獲取系統權限。

 

當然,如果你手上有源碼環境,那就不要這么麻煩了,直接將你的程序放到源碼環境進行編譯即可。下面討論的前提是,我們有系統的簽名程序,但沒有系統源碼環境,但是有在線源碼,比如http://androidxref.com/網站,具體參考:

 http://gqdy365.iteye.com/blog/2111949

 

 

開始獲取系統權限的過程:       

(1)獲取platform.pk8和platform.x509.pem

        通常在源碼環境的build\target\product\security目錄下,不同的系統版本找對應的文件(我用的是4.4.2的版本)

(2)獲取signapk,.jar

        通常在源碼環境的build\tools\signapk目錄下,我是直接在網上下載的4.4.2的版本

(3)將(1)(2)中獲取的文件和生成的apk放在一個文件夾中,進入到這個目錄,執行簽名操作:

         java -jar signapk.jar  platform.x509.pem platform.pk8 原.apk 新.apk 

 

到這里獲取系統權限還沒有結束,還需要設置mainifest.xml,在application中加上:

android:process="com.android.phone"  

 

在mainifest.xml的manifest上加上:

android:sharedUserId="android.uid.phone"  

 

 

2.將android源碼編譯的jar包項目中引用,直接使用撥打電話

  直接調用的方法:

PhoneFactory.makeDefaultPhones(context);

Phone p = PhoneFactory.getDefaultPhone();

CallManager cm = CallManager.getInstance();

cm.registerPhone(p);

Phone phone = cm.getDefaultPhone();

phone.dial(number);

 

 

在build.pradle文件中設置:

defaultConfig {

…

multiDexEnabled true

}

 dexOptions {

        javaMaxHeapSize "4g"

        incremental true

 }

 

 

 

總結,我在網上找到的文章中說可以實現,但具體我實踐下來是沒有成功的,網上實現實現這個功能的系統版本是比較低的,而我實踐的版本是4.4.2

可以參考一下面的博客文章:

http://blog.csdn.net/u013401219/article/details/45887193

http://blog.sina.com.cn/s/blog_65977dde0100uu7b.html

 

獲取系統權限用到的工具(4.4.2)

http://files.cnblogs.com/files/IT-Goddess/android4.4.2.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM