2010-08-18 84 views
6

在Android手機上的通話 - >其他設置 - >來電顯示如何以編程方式隱藏Android上的來電顯示

可以隱藏您的來電顯示。我想從我的代碼中以編程方式做到這一點,但無法找到一種方法來做到這一點。

我通過

android.provider android.telephony

搜索2.1版,是不是能夠找到它。

有沒有人成功解決了這個問題?

在此先感謝。最好的祝福。

回答

1

這裏我將介紹兩種我嘗試過的方法。

1.)可以從您的應用程序顯示其他呼叫設置屏幕。儘管它看起來像是「設置」應用程序的一部分,但事實並非如此。這種活性是本機應用程序的一部分,並且其可以用下面的意圖上前:

Intent additionalCallSettingsIntent = new Intent("android.intent.action.MAIN"); 
ComponentName distantActivity = new ComponentName("com.android.phone", "com.android.phone.GsmUmtsAdditionalCallOptions"); 
additionalCallSettingsIntent.setComponent(distantActivity); 
startActivity(additionalCallSettingsIntent); 

然後用戶必須手動按壓在來電顯示偏好,並得到單選按鈕與3個選項。

當我問這個問題時,這實際上並不是我想達到的。我想避免步驟,用戶必須選擇其他選項。

2.)當在本地電話應用程序中執行1.)中所述的方法時,已使用來自com.android.internal.telephony.Phone的功能setOutgoingCallerIdDisplay()。 這是下一個方法的基礎:使用這個類的Java反射,並嘗試用適當的參數調用該函數:

try 
{ 
    Class <?> phoneFactoryClass = Class.forName("com.android.internal.telephony.PhoneFactory"); 

    try 
    { 
     Method getDefaultPhoneMethod = phoneFactoryClass.getDeclaredMethod("getDefaultPhone");    
     Method makeDefaultPhoneMethod = phoneFactoryClass.getMethod("makeDefaultPhone" , Context.class);     

     try 
     {      
      makeDefaultPhoneMethod.invoke(null, this); 
      Object defaultPhone = getDefaultPhoneMethod.invoke(null); 

      Class <?> phoneInterface = Class.forName("com.android.internal.telephony.Phone"); 
      Method getPhoneServiceMethod = phoneInterface.getMethod("setOutgoingCallerIdDisplay", int.class, Message.class); 

      getPhoneServiceMethod.invoke(defaultPhone, 1, null);      
     } 
     catch (InvocationTargetException ex) 
     { 
      ex.printStackTrace();     
     } 
     catch (IllegalAccessException ex) 
     { 
      ex.printStackTrace();     
     }  
    } 
    catch (NoSuchMethodException ex) 
    { 
     ex.printStackTrace();     
    }   
} 
catch (ClassNotFoundException ex) 
{ 
    ex.printStackTrace();     
}  

首先,我嘗試了用getDefaultPhone(),但我得到的RuntimeException

「PhoneFactory.getDefaultPhone必須從Looper線程中調用」

顯然,問題在於我試圖從不是本機電話應用程序的消息循環中調用此方法。

試圖使自己的默認電話能避免這一點,但是這是一個安全違規:

ERROR/AndroidRuntime(2338):java.lang.SecurityException異常:權限拒絕:不允許發送廣播android.provider。電話。從PID = 2338,UID SPN_STRINGS_UPDATED = 10048

克服(兩個),這將是使用相同的密鑰爲核心的系統應用程序簽名的應用程序,

Run secure API calls as root, android

+0

如何獲得與核心系統應用程序相同的密鑰以及如何簽署我的應用程序? – pengwang 2012-03-27 00:50:53

+0

請參閱我答案底部的鏈接。你會在那裏找到更詳細的討論。但總的來說,由於安全原因,除非您正在「烹飪」您自己的Android系統版本,否則不應該有可能獲得它。 – Zelimir 2012-03-27 06:55:55

+0

@Zelimir可以請你幫我[這裏](http://stackoverflow.com/questions/22908750/how-to-know-whether-hiding-caller-id-is-enabled-or-not-in-android) ... – RuntimeException 2014-04-14 05:00:09

0

我不知道這是否是一個全球性的特徵,但是澳大利亞的手機可以通過#31#或前綴主叫號碼隱藏自己的號碼。這可能不是完美的解決方案,但是這樣的前綴在編碼過程中可能適合您的需求。

+0

下所描述的唯一途徑是的,我意識到這一點,但我正在尋找某種方式通過Android系統實現,並獨立於網絡提供商。無論如何,謝謝你的提示。 – Zelimir 2011-03-08 09:11:58

相關問題