我正在尝试开发一个非常简单的通话应用程序来替换库存版本。基本上,我只想回答来电并向用户展示一个非常简单的自定义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>
第三方应用甚至可以替换通话应用中的默认值吗?
我是否有使用此API的示例实现作为参考?我找到了google implementation,但这是一个系统应用,它使用了其他应用无法使用的一些权限(例如:android.permission.MODIFY_PHONE_STATE
)。
我是否认为在提供正确的InCallService
清单注册和存根实施后我可以在Default Apps -> Phone
下找到我的应用程序?我是否需要申报其他内容?
感谢。
答案 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
答案 1 :(得分:0)
- 第三方应用程序是否有可能替换通话应用程序中的默认设置?
是的,从API 23开始是可能的。
- 是否有一些使用此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"} ];
)。
我唯一知道的是我创建的示例https://github.com/arekolek/simple-phone,该示例在其他答案中也已经提到。
- 我是否假设在提供正确的
android.permission.MODIFY_PHONE_STATE
清单注册和存根实现后可以在InCallService
下找到我的应用?我需要声明其他内容吗?
实际上,不是。
就像another answer on the topic中提到的那样,您完全不需要Default Apps -> Phone
即可出现在该列表中。
不过,您需要用两个意图过滤器注册一个活动,一个使用InCallService
Uri方案,一个使用空方案(仅其中一个是不够的):
tel
它是vaguely mentioned in the docs和stated 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>
。