为什么当尝试在Android 8上保存联系人时,ionic-native / contacts插件会导致应用崩溃?

时间:2018-07-20 08:57:36

标签: cordova ionic-framework ionic3 cordova-plugins ionic-native

我尝试使用ionic-native/contacts plugin保存联系人,它适用于除android 8之外的所有android版本,该应用已停止并关闭。 这是我的代码,与离子框架示例相同:

SaveToContact(phone, name) {
try {

  let contact: Contact = this.contacts.create();
  contact.name = new ContactName(null, name, '');
  contact.phoneNumbers = [new ContactField('mobile', phone)];
  this.global.presentToast('Will Save!'),
    contact.save().then(
      () => this.global.presentToast('Contact saved!'),
      (error: any) => this.global.presentToast('Error saving contact: No Permission')
    );
} catch (e) {
  this.global.presentToast(e);
}

我使用android-26来构建apk,而这些是ionic-native/contacts plugin的版本

  

“ @ angular / core”:“ 5.0.3”

     

“离子角”:“ 3.9.2”

     

“ cordova-plugin-contacts”:“ ^ 3.0.1”

     

“ @ ionic-native / contacts”:“ ^ 4.7.0”

我也将插件对象放在应用程序模块的provider数组中,但仍然使应用程序崩溃。

3 个答案:

答案 0 :(得分:2)

此插件已损坏,原因是Android处理8.0(https://developer.android.com/about/versions/oreo/android-8.0-changes#o-pri)中的权限的方式发生了变化。

基本上:过去,请求联系人写权限还会为您提供联系人读权限,但是现在您要同时执行两个操作,就必须同时请求两个(但只会询问用户一次)。保存功能使应用程序崩溃的原因是,它正在编写联系人,然后在只有写权限的情况下尝试将其读回。

我已经分叉了存储库,并更新了ContactManager.java文件以使其可用于Android 8.0:https://github.com/duncan-c/cordova-plugin-contacts/blob/master/src/android/ContactManager.java

您可以简单地覆盖 plugins / cordova-plugin-contacts / src / android 目录中的ContactManager.java文件,然后通过删除然后重新添加android来强制ionic重新编译插件。平台:

>ionic platform rm android

>ionic platform add android

答案 1 :(得分:1)

看看官方的cordova-plugin github上的发行说明。 Reference

它表示他们已自2017年12月15日起正式弃用该插件,并且他们并未宣布在此之前使该插件与android 8.0兼容,因此我们可以放心地假设他们在使其成为android 8.0之前已停止使用该插件。兼容。

答案 2 :(得分:1)

enter image description here

将targetSdkVersion更改为23