更换通话应用

时间:2016-01-18 18:48:16

标签: android android-6.0-marshmallow

背景

我正在尝试开发一个非常简单的通话应用程序来替换库存版本。基本上,我只想回答来电并向用户展示一个非常简单的自定义UI。不需要拨出电话或任何花哨的东西。

在网上搜索我找到了包android.telecom.incallservice(API 23中提供)。 此服务由希望提供用于管理电话呼叫的用户界面的任何应用实施。

看起来很有希望,但我无法让它发挥作用。我已经创建了扩展InCallService的简单服务,并在文档描述的清单中声明它。但是,我希望能够将设置中的默认手机应用程序更改为我自己的,但我只能找到手机应用程序。

代码

这是来自文档的清单声明。我已将BIND_IN_CALL_SERVICE替换为BIND_INCALL_SERVICE,因为我猜这是一个错字。

<service android:name="your.package.YourInCallServiceImplementation" android:permission="android.permission.BIND_INCALL_SERVICE">
    <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" />
    <intent-filter>
        <action android:name="android.telecom.InCallService"/>
    </intent-filter>
</service>

问题

  1. 第三方应用甚至可以替换通话应用中的默认值吗?

  2. 我是否有使用此API的示例实现作为参考?我找到了google implementation,但这是一个系统应用,它使用了其他应用无法使用的一些权限(例如:android.permission.MODIFY_PHONE_STATE)。

  3. 我是否认为在提供正确的InCallService清单注册和存根实施后我可以在Default Apps -> Phone下找到我的应用程序?我是否需要申报其他内容?

  4. 感谢。

2 个答案:

答案 0 :(得分:0)

根据docs并在评论时,您需要在清单中添加它:

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();

HSSFFont font = workbook.createFont();
font.setColor(HSSFColor.WHITE.index);
HSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setFillForegroundColor(HSSFColor.RED.index);


List<String> header = Arrays.asList(new String [] {"YEAR", "MONTH", "NAME", "SURNAME"});

HSSFRow rowhead = sheet.createRow((short) 0);
int cellnum = 0;
for (String s : header) {
    HSSFCell cell = rowhead.createCell(cellnum++);
    cell.setCellValue(s);
    cell.setCellStyle(style);
}


FileOutputStream fileOut = new FileOutputStream(filename);
workbook.write(fileOut);
fileOut.close();
workbook.close();

<service android:name="your.package.YourInCallServiceImplementation" android:permission="android.permission.BIND_INCALL_SERVICE"> <meta-data android:name="android.telecom.IN_CALL_SERVICE_UI" android:value="true" /> <intent-filter> <action android:name="android.telecom.InCallService"/> </intent-filter> </service> 必须替换为实现此服务的类。


android:name

<activity android:name="your.package.YourDialerActivity"> <intent-filter> <action android:name="android.intent.action.DIAL" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 必须替换为为自己的拨号程序实现实现主要活动的类。

  

在这里您可以找到有关此的更多信息:   https://developer.android.com/guide/topics/connectivity/telecom/selfManaged

     

这是一个示例项目,您可以将其用作指导:   https://github.com/arekolek/simple-phone

     

这是https://stackoverflow.com/a/49835987/1916449

答案 1 :(得分:0)

  
      
  1. 第三方应用程序是否有可能替换通话应用程序中的默认设置?
  2.   

是的,从API 23开始是可能的。

  
      
  1. 是否有一些使用此API的示例实现,可以用作参考?我找到了google implementation,但这是一个系统应用程序,它利用了一些其他应用程序不可用的权限(例如:a3 = [ {id:1, name:"parent 1"}, {id:2, name:"parent 2"}, {id:3, name:"parent 3"}, {id:4, name:"parent 4"}, {id:5, name:"parent 5"}, {id:6, name:"parent 6"} ]; )。
  2.   

我唯一知道的是我创建的示例https://github.com/arekolek/simple-phone,该示例在其他答案中也已经提到。

  
      
  1. 我是否假设在提供正确的android.permission.MODIFY_PHONE_STATE清单注册和存根实现后可以在InCallService下找到我的应用?我需要声明其他内容吗?
  2.   

实际上,不是。

就像another answer on the topic中提到的那样,您完全不需要Default Apps -> Phone即可出现在该列表中。

不过,您需要用两个意图过滤器注册一个活动,一个使用InCallService Uri方案,一个使用空方案(仅其中一个是不够的):

tel

它是vaguely mentioned in the docsstated explicitly in AOSP code

这足以显示在该列表中。只有到了provide the UI for the call,您才真正需要<intent-filter> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.DIAL" /> </intent-filter>