Android Studio快速集成(推荐)

Android Studio快速集成(推荐)

关于Android Studio

Android Studio是Google力推的Android开发环境,在IntelliJ IDEA基础上进行了大量功能完善和优化,包括:

  • 基于Gradle的构建支持
  • Android 专属的重构工具和Instant Run快速修复技术
  • 功能强大的布局编辑器,可以让你拖拉 UI 控件并进行效果预览
  • 全新的 Android 模拟器大约比之前的模拟器快 3 倍,同时由于 ADB 的增强,传输应用和数据到模拟器上的速度比到物理设备上快 10 倍。
  • 提供性能分析工具以捕获性能、可用性、版本兼容性等问题

因此我们强烈推荐Android开发者将现有项目迁移到Android Studio环境,并在Android Studio下更快地实现个推SDK的集成工作。

前言

  • 本文档介绍Android Studio提供的基于Maven的快速集成方案,配置简单、不容易出问题、后续更新维护方便,因此我们强烈推荐应用开发者根据本文档步骤进行个推集成。
  • 本文档适用SDK版本:2.9.5.0及以后
  • 请参考Getui_SDK_Demo_AS_mavenDemo工程

1. 创建个推应用

  • 请登录 http://dev.getui.com ,选择登记应用并填写应用名称和包名信息,完成应用创建:

img_as_create

img_as_create

  • 点击应用配置,获取到相应的AppIDAppKeyAppSecret信息:

img_as_create

2. 打开项目工程

  • 启动Android Studio, 打开您之前创建的Android项目工程:

img_as_open

  • 如果需要从原有的Eclipse项目导入,请选择Import project (Eclipse ADT, Gradle, etc.)

img_as_import

3. 添加个推SDK及相关配置


一、老版本(>=2.9.5.0)升级到 2.12.5.0 及以上版本注意事项:

  1. 为兼容Android9.0,务必在application节点添加android:usesCleartextTraffic="true"



二、老版本升级到 2.9.5.0 及以上版本注意事项:

  1. 替换旧的GetuiSDKxxx.jar,并删除GetuiExt-xxx.jar和所有jni相关目录下的libgetuiext.so
  2. 删除AndroidManifest.xml中以下组件相关的配置,最新的SDK已经不再需要这些组件:

    com.igexin.sdk.PushServiceUser

    com.igexin.sdk.PushManagerReceiver

    com.igexin.getuiext.activity.GetuiExtActivity

    com.igexin.getuiext.service.PayloadReceiver

    com.igexin.getuiext.service.GetuiExtService
  3. 删除app/src/main/res/layout目录下原来旧的布局文件,包括getui_notification.xmlnotification_inc.xmlincrement_popup_dialog.xml,请使用最新SDK所提供的getui_notification.xml即可
  4. 请参考本文档重新进行配置集成

3.1 个推Android SDK资料包结构

GETUI_ANDROID_SDK/
  |- readme.txt (SDK资料包说明)
  |- 接入文档/ (Android SDK相关集成文档PDF版本)
  |- 资源文件/
  |    |- res/
  |    |    |- layout/
  |    |    |    |- getui_notification.xml (个推SDK所需的布局文件)
  |    |    |- raw
  |    |    |    |- keep.xml (用于资源保留的描述文件)
  |    |- so/ (各 CPU 架构so库)
  |    |   |- arm64-v8a/
  |    |   |- armeabi/
  |    |   |- armeabi-v7a/
  |    |   |- mips/
  |    |   |- mips64/
  |    |   |- x86/
  |    |   |- x86_64/
  |    |- GetuiSDK2.12.5.0.jar
  |    |- android-support-v4.jar
  | - Demo工程/
  |    |- Getui_SDK_Demo_AS_maven/ (AndroidStudio快速集成Demo工程)
  |    |- Getui_SDK_Demo_AS_official/ (AndroidStudio标准集成Demo工程)
  |    |- Getui_SDK_Demo_Eclipse_official/ (Eclipse集成Demo工程)

3.2 添加Maven库地址

尽管我们会将最新的个推SDK同步部署在JCenter上,但是为了保障稳定使用,我们建议开发者额外配置个推提供的maven库从而实现更快速的访问。

  • 在以项目名为命名的顶层build.gradle文件中,添加个推maven库地址,如下所示:

img_asmv_maven

//Maven URL地址
maven {
    url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
}

3.3 配置依赖

  • app/build.gradle文件中引用个推SDK依赖库,如下图所示:

img_asmv_dep

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.getui:sdk:2.12.5.0'
    compile 'com.android.support:support-v4:+'
}

3.4 配置 so 库

目前个推SDK支持armeabiarmeabi-v7aarm64-v8amipsmips64x86x86_64这几种 CPU 架构,请根据项目情况指定所需的架构。


如果项目中包含的其他 so 库只支持其中某几种 cpu 架构,那么应该根据其他 so 库所支持的 CPU 架构的最小集来配置。否则如果在特定架构上未能支持所有 so 库,则很可能导致程序运行异常。切记!

  • 在项目根目录下的gradle.properties文件中配置useDeprecatedNdk参数,如下图所示:

img_asmv_sop

android.useDeprecatedNdk=true
  • app/build.gradle文件中的android.defaultConfig下指定所需的 CPU 架构,如下图所示:

img_asmv_son

android {
  ...
  defaultConfig {
    ...
    ndk {
      abiFilters "armeabi", "armeabi-v7a", "x86_64"
    }
  }
}

3.5 配置个推应用参数

  • app/build.gradle文件中的android.defaultConfig下添加manifestPlaceholders,配置个推相关的应用参数(参见【步骤1】),如下图所示:

img_asmv_param

manifestPlaceholders = [
    GETUI_APP_ID : "APP_ID",
    GETUI_APP_KEY : "APP_KEY",
    GETUI_APP_SECRET : "APP_SECRET"
]
  • 请根据【步骤1】获取到的应用参数进行相应替换APP_IDAPP_KEYAPP_SECRET的值

3.6 适配Android P

<!-- Android9.0以上默认不支持http通信,为保证SDK正常使用 -->
<!-- 请在application节点下新增该属性 -->
<application android:usesCleartextTraffic="true">

3.7 配置自定义推送服务

为了让推送服务在部分主流机型上更稳定运行,从2.9.5.0版本开始,个推支持第三方应用配置使用自定义Service来作为推送服务运行的载体。

  • 在项目源码中添加一个继承自Android.app.Service的类,参考下列代码实现Service各个生命周期回调方法:
package com.getui.demo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

import com.igexin.sdk.GTServiceManager;

public class DemoPushService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
        GTServiceManager.getInstance().onCreate(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        return GTServiceManager.getInstance().onStartCommand(this, intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return GTServiceManager.getInstance().onBind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        GTServiceManager.getInstance().onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        GTServiceManager.getInstance().onLowMemory();
    }
}

  • 在AndroidManifest.xml中添加上述自定义Service:
<service
  android:name="com.getui.demo.DemoPushService"
  android:exported="true"
  android:label="PushService"
  android:process=":pushservice">
</service>

3.8 配置可选权限

  • 上述接入方式已包含个推服务所需的所有必备权限。在此之外,您还可以配置以下可选权限,以便使用个推3.0提供的电子围栏功能。请在AndroidManifest.xml<manifest>根标签下添加如下配置:
<!-- iBeancon功能所需权限 -->;
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 个推3.0电子围栏功能所需权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

3.9 导入通知栏图标

  • 为了修改默认的通知图标以及通知栏顶部提示小图标,请在资源目录的res/drawable-ldpi/res/drawable-mdpi/res/drawable-hdpi/res/drawable-xhdpi/res/drawable-xxhdpi/等各分辨率目录下,放置相应尺寸的文件名为push.pngpush_small.png图片,如图所示:

  • 建议的push.png图片尺寸如下:
ldpi:    48*48
mdpi:    64*64
hdpi:    96*96
xhdpi:   128*128
xxhdpi:  192*192
  • 该图标push.png将会作为通知图标,如下所示:

img_asmv_pushicon

  • 建议的push_small.png图片尺寸如下:
ldpi:    18*18
mdpi:    24*24
hdpi:    36*36
xhdpi:   48*48
xxhdpi:  72*72
xxxhdp:  96*96
  • 该图标push_small.png将会作为通知图标展示在通知栏顶部,如下所示:
  • push_small.png设计规范请参考状态栏图标设计规范

img_asmv_small_icon

3.10 资源精简配置

  • 如果您的工程启用了资源精简,即如果在app/build.gradleandroid.buildTypes.release下配置了shrinkResources true,为了避免个推SDK所需资源被错误精简导致功能异常,需要在项目资源目录res/raw中添加keep.xml文件,路径如下:

  • 在SDK资料包中GETUI_ANDROID_SDK/资源文件/raw目录下有keep.xml示例文件,完整内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/getui_notification,
    @drawable/push,
    @drawable/push_small"/>
    <!-- 若您需要使用其他自定义推送图标,也需要在此处添加 -->
  • 如果你的项目工程已经使用了keep.xml,则只需在tools:keep中增加对@layout/getui_notification的声明,例如:
<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/other_res,...,
    @layout/getui_notification,
    @drawable/push,
    @drawable/push_small"/>
   <!-- 若您需要使用其他自定义推送图标,也需要在此处添加 -->
  • 如果您的工程使用了AndResGuard进行资源精简,为了避免个推SDK所需资源被错误精简导致功能异常,需要为个推添加白名单配置。

gradle集成AndResGuard的方式,需要您在andResGuardwhiteList节点下添加如下代码:

andResGuard {
    ...
    whiteList = [
           ...
           // for getui
           "R.drawable.push",        
           "R.drawable.push_small",
           "R.layout.getui_notification",
           "R.id.getui_*"
           // 若您需要使用其他自定义推送图标,也需要在此处添加
    ]
    ...
}

命令行使用AndResGuard的方式,需要您在config.xml文件中的<issue id=whitelist>节点下添加如下代码

<issue id="whitelist" isactive="true">
    <path value="<your_package_name>.R.drawable.push"/>
    <path value="<your_package_name>.R.drawable.push_small"/>
    <path value="<your_package_name>.R.layout.getui_notification"/>
    <path value="<your_package_name>.R.id.getui_*"/>
    <!-- 若您需要使用其他自定义推送图标,也需要在此处添加 -->
</issue>

4. 编写集成代码

4.1 初始化SDK

我们建议应用开发者在Activity或Service类中调用个推SDK的初始化方法,确保SDK在各种情况下都能正常运行。一般情况下可以在主Activity的onCreate()或者onResume()方法中调用,也可以在多个主要界面Activity的onCreate()或onResume()方法中调用。反复调用SDK初始化并不会有什么副作用。

  • 在应用的 Activity 里导入PushManager类,如下所示:
import com.igexin.sdk.PushManager;
  • 然后在 Activity 的onCreate()或者onResume()方法中调用个推SDK初始化方法。如果使用了自定义推送服务,初始化方法还需要传入新的自定义推送服务名:
// com.getui.demo.DemoPushService 为第三方自定义推送服务
PushManager.getInstance().initialize(this.getApplicationContext(), com.getui.demo.DemoPushService.class);

4.2 接收推送服务事件


从2.9.5.0版本开始,为了解决小概率发生的Android广播丢失问题,我们推荐应用开发者使用新的IntentService方式来接收推送服务事件(包括CID获取通知、透传消息通知等)

  • 在项目源码中添加一个继承自com.igexin.sdk.GTIntentService的类,用于接收CID、透传消息以及其他推送服务事件。请参考下列代码实现各个事件回调方法:
package com.getui.demo;

import android.content.Context;
import android.os.Message;
import android.util.Log;

import com.igexin.sdk.GTIntentService;
import com.igexin.sdk.PushConsts;
import com.igexin.sdk.PushManager;
import com.igexin.sdk.message.FeedbackCmdMessage;
import com.igexin.sdk.message.GTCmdMessage;
import com.igexin.sdk.message.GTTransmitMessage;
import com.igexin.sdk.message.SetTagCmdMessage;

/**
 * 继承 GTIntentService 接收来自个推的消息, 所有消息在线程中回调, 如果注册了该服务, 则务必要在 AndroidManifest中声明, 否则无法接受消息<br>
 * onReceiveMessageData 处理透传消息<br>
 * onReceiveClientId 接收 cid <br>
 * onReceiveOnlineState cid 离线上线通知 <br>
 * onReceiveCommandResult 各种事件处理回执 <br>
 */
public class DemoIntentService extends GTIntentService {

    public DemoIntentService() {

    }

    @Override
    public void onReceiveServicePid(Context context, int pid) {
    }

    @Override
    public void onReceiveMessageData(Context context, GTTransmitMessage msg) {
    }

    @Override
    public void onReceiveClientId(Context context, String clientid) {
        Log.e(TAG, "onReceiveClientId -> " + "clientid = " + clientid);
    }

    @Override
    public void onReceiveOnlineState(Context context, boolean online) {
    }

    @Override
    public void onReceiveCommandResult(Context context, GTCmdMessage cmdMessage) {
    }

    @Override
    public void onNotificationMessageArrived(Context context, GTNotificationMessage msg) {
    }

    @Override
    public void onNotificationMessageClicked(Context context, GTNotificationMessage msg) {   
    }
}
  • AndroidManifest.xml中配置上述 IntentService 类:
<service android:name="com.getui.demo.DemoIntentService"/>
  • 在个推SDK初始化后,注册上述 IntentService 类:
// com.getui.demo.DemoIntentService 为第三方自定义的推送服务事件接收类
PushManager.getInstance().registerPushIntentService(this.getApplicationContext(), com.getui.demo.DemoIntentService.class);


关于原有广播方式和新的IntentService方式兼容性说明:

  1. 如果调用了registerPushIntentService方法注册自定义IntentService,则SDK仅通过IntentService回调推送服务事件;
  2. 如果未调用registerPushIntentService方法进行注册,则原有的广播接收器仍然可以继续使用。

5. 测试

  • 连接手机或启动Android模拟器,编译运行你的工程,查看logcat信息。在搜索框中输入clientid,如果能显示clientid is xxx日志,则说明个推SDK已经成功运行起来了:

img_as_logcat

  • 登录 个推开发者中心,进入【个推·消息推送】产品,点击【创建推送】,进入待测试应用的推送通知界面:

img_as_conlose

  • 依次填写通知标题通知内容,点击发送按钮即可向该推送应用名下所有CID推送通知消息。具体推送操作方法详见:创建推送通知

  • 如果手机或模拟器收到消息,显示下图所示通知,那么恭喜您,个推SDK接入测试已经成功完成!

img_as_success

通知
2018.10.29 iOS SDK 2.3.1.0

新增语音播报功能。 简化注册DeviceToken、注册VoipToken接口。 修复GTExtensionSDK crash问题。 因新版本功能修改,需要添加“libresolv.tbd”库

......
2018.10.09 Android SDK 4.3.2.0

新增通知覆盖、撤回 适配Android 9.0

......
2018.09.27 PYTHON SDK 4.1.0.0

添加python新加接口功能文档说明

......
2018.09.27 PHP SDK 4.1.0.0

修改新鉴权方式 支持iOS语音播报 iOS透传消息模版支持副标题

......
2018.09.06 JAVA SDK 4.1.0.0

修改新鉴权方式 支持iOS语音播报 支持消息撤回和覆盖

......

文档中心搜索