Integração do Android
Integração do código de amostra
O código de amostra de integração está disponível aqui https://github.com/finogeeks/mop-android-demo Se você não tem acesso ao github em seu ambiente, você também pode visitar o repositório espelho no gitee clicando aqui.
1. Obter credenciais de miniaplicaivos
Após criar o aplicativo e adicionar o Bundle ID, se precisar exportar a chave SDK correspondente e o SDK Key. Por favor, selecione "Copiar" após o Bundle ID correspondente. Você pode colar usando Ctrl+V ou Command+V;
1.1 Criando aplicativos
Usuários registrados precisam fazer login em 'Gerenciamento de Aplicativos - Novo Aplicativo Parceiro' para concluir a criação do aplicativo;

1.2 Obtendo a chave SDK e o SDK Secret
Após criar o aplicativo e adicionar o Bundle ID correspondente, se precisar exportar a chave SDK e o segredo SDK correspondentes, selecione Copiar ao lado do Bundle ID correspondente. Você pode colar usando Ctrl+V ou Command+V;
Inscreva-se no DeepL Pro para editar este documento. Visite www.DeepL.com/profor mais informações. Dos quais:
- Chave SDK: Esta é a credencial para o aplicativo parceiro usar o SDK do applet. Se a chave do SDK falhar, todas as APIs do SDK não estarão disponíveis
- SDK SECERT: é o certificado de segurança para acessar o serviço, não passe para terceiros.
de Dica
Para obter detalhes sobre como criar aplicativos e obter o SDK KEY e o SDK SECRET, consulte a seção 「Introdução-Diretrizes de Operação-Diretrizes Empresariais-7」 seção.
2.Importando o SDK
2.1 O que configurar no projeto Build.gradle
Adicione o endereço do repositório maven ao build.gradle do projeto em
maven {
url "https://gradle.finogeeks.club/repository/applet/"
credentials {
username "applet"
password "123321"
}
}Como parte do código no SDK é escrito em Kotlin, é necessário adicionar o plugin gradle para Kotlin ao build.gradle do projeto.
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"A configuração completa do build.gradle do projeto é a seguinte:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:3.5.2"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
}
}
allprojects {
repositories {
google()
jcenter()
maven {
url "https://gradle.finogeeks.club/repository/applet/"
credentials {
username "applet"
password "123321"
}
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}2.2 Dependências do SDK em Gradle
Adicione uma dependência de finapplet no dependencies do gradle
arquivo.
implementation 'com.finogeeks.lib:finapplet:x.y.z' //x.y.z must be
replaced with the specific version numberNota
O Libraísmo Dinâmico no SDK é dinâmico hardnet.hardned As bibliotecas não podem ser compactadas ao compilar e embalar, caso contrário Um erro será reformado ao carregar.
Então você precisa adicionar um doNotStrip configuração para build.gradle SOB O módulo de aplicativo.
packagingOptions {
// libsdkcore.so, libfin-yuvutil.so are hardened and cannot be compressed, otherwise an error will be reported when loading dynamic libraries
doNotStrip "*/x86/libsdkcore.so"
doNotStrip "*/x86_64/libsdkcore.so"
doNotStrip "*/armeabi/libsdkcore.so"
doNotStrip "*/armeabi-v7a/libsdkcore.so"
doNotStrip "*/arm64-v8a/libsdkcore.so"
doNotStrip "*/x86/libfin-yuvutil.so"
doNotStrip "*/x86_64/libfin-yuvutil.so"
doNotStrip "*/armeabi/libfin-yuvutil.so"
doNotStrip "*/armeabi-v7a/libfin-yuvutil.so"
doNotStrip "*/arm64-v8a/libfin-yuvutil.so"
}A configuração completa é a seguinte.
apply plugin: 'com.android.application'
android {
buildToolsVersion '28.0.3'
compileSdkVersion 28
defaultConfig {
applicationId "com.finogeeks.finappletdemo"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
packagingOptions {
// libsdkcore.so, libyuvutil.so are hardened and cannot be compressed, otherwise it will report an error when loading dynamic libraries
doNotStrip "*/x86/libsdkcore.so"
doNotStrip "*/x86_64/libsdkcore.so"
doNotStrip "*/armeabi/libsdkcore.so"
doNotStrip "*/armeabi-v7a/libsdkcore.so"
doNotStrip "*/arm64-v8a/libsdkcore.so"
doNotStrip "*/x86/libyuvutil.so"
doNotStrip "*/x86_64/libyuvutil.so"
doNotStrip "*/armeabi/libyuvutil.so"
doNotStrip "*/armeabi-v7a/libyuvutil.so"
doNotStrip "*/arm64-v8a/libyuvutil.so"
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.finogeeks.lib:finapplet:x.y.z' //x.y.z must be replaced with the specific version number
}2.3 Configurando as regras de ofuscação
Depois de integrar o SDK, a seguinte configuração precisa ser Adicionado ao arquivo de configuração de regras de ofuscação do projeto para Evite a offusão de partes do SDK que não podem ser ofuscadas.
-keep class com.finogeeks.** {*;}3.SDK Inicialização
Recomendamos fortemente que o SDK seja inicialista em Application .O Os parâmetros a serem transmitidos para inicializar o SDK são os seguintes (SDK A inicialização deve ser chamada apenas uma vez e chamadas repetidas devem ser evitado).
3.1 Informações de configuração para a estrutura do applet
Antes do verso 2.13.102 , O SDK só suporta a configuração de uma mensagem de servidor e só podia abrir applets em um único Ambiente. Os parâmetros de configuração que seguem.
FinAppConfig config = new FinAppConfig.Builder()
.setSdkKey( "SDK Key information" ) // SDK Key
.setSdkSecret( "SDK Secret information" ) // SDK Secret
.setApiUrl( "server address" ) // server address
.setApiPrefix( "/api/v1/mop/" ) // Server interface request routing prefix
.setEncryptionType( "encryptionType" ) // encryptionType, national:SM, md5: MD5 (recommended)
.build();Da versão 2.13.102 Em diante é público configurar múltiplos Informações do servidor para abrir applets em diferentes ambientes no O mesmo horário. Os parâmetros de configuração são os seguintes.
// Collection of server information
List< FinStoreConfig> storeConfigs = new ArrayList<>();
// Information on Server 1
FinStoreConfig storeConfig1 = new FinStoreConfig(
"SDK Key Information" , // SDK Key
"SDK Secret information" , // SDK Secret
"Address of server 1" , // Server address
"Server 1's data upload server address" , // the address of the data upload server
"/api/v1/mop/" , // Server interface request routing prefix
"" ,
"encryption method" // encryption method, cc:SM, md5: MD5 (recommended)
);
storeConfigs.add(storeConfig1);
// Information on Server 2
FinStoreConfig storeConfig2 = new FinStoreConfig(
"SDK Key Information" , // SDK Key
"SDK Secret information" , // SDK Secret
"Address of server 2" , // Server address
"Server 2's data upload server address" , // the address of the data upload server
"/api/v1/mop/" , // Server interface request routing prefix
"" ,
"encryption method" // encryption method, cc:SM, md5: MD5 (recommended)
);
storeConfigs.add(storeConfig2);
FinAppConfig config = new FinAppConfig.Builder()
.setFinStoreConfigs(storeConfigs) // A collection of server information
.build();3.2 Definindo o retorno de chamada do status de inicialização do SDK
Implementação da interface FiCallback para ouvir o Estado de inicialização do SDK.
// SDK initialization result callback for receiving SDK initialization status
FinCallback< Object> callback = new FinCallback< Object>() {
@Override
public void onSuccess(Object result) {
// SDK initialisation successful
}
@Override
public void onError(int code, String error) {
// SDK initialization failed
Toast.makeText(AppletApplication.this, "SDK initialization failed" , Toast.LENGTH_SHORT).show();
}
@Override
public void onProgress(int status, String error) {
}
};3.3 Inicializando o SDK
Inicialmente, o SDK chamando a interface inicializada.
FinAppClient.INSTANCE.init(this, config, callback);3.4 Inicialização do SDK para Multi-Processamento de processos
O SDK é implementado usando um multi-Mecanismo de processo onde cada O applet é executado em um processo de seção, ou seja, um applet corresponde a um Processo. Ao inicializar o SDK, um ponto a ser observado em particular Que o processo de applet não observa executar nenhuma inicialização Operações quando é criado, evento se o applet sdk for inicializado, Não precisa ser executado no processo de applet. Por exemplo, se o aplicativo usa algum terceiro-Bibliotecas de festas isso Precisa ser inicializado quando o aplicativo é iniciado, então quando o A inicialização é realizada em Application , Apenas o processo atual Precisa inicializar o terceiro-Bibliotecas de festas se for o host Processo, o processo de applet não precisa inicializar Bibliotecas. Antes de inicializar o SDK, certifique -se de determinar qual Processar o processo atual é e, se for um processo de applet, não Execute quaisquer operações :.
if (FinAppClient.INSTANCE.isFinAppProcess(this)) {
return;
}O exposto acima é o e todo o processo de inicializar o SDK. O código é o seguinte.
package com.example.finogeeks.appletdemo;
import android.os.Process;
import android.support.multidex.MultiDexApplication;
import android.text.TextUtils;
import android.widget.Toast;
import com.example.finogeeks.appletdemo.api.ApiOpenPage;
import com.example.finogeeks.appletdemo.api.ApiOpenPageForResult;
import com.example.finogeeks.appletdemo.api.DrawModule;
import com.example.finogeeks.appletdemo.util.ProcessUtilKt;
import com.finogeeks.lib.applet.client.FinAppClient;
import com.finogeeks.lib.applet.client.FinAppConfig;
import com.finogeeks.lib.applet.interfaces.FinCallback;
/**
* Application of {@link android.app.}
*/
public class AppletApplication extends MultiDexApplication {
@Override
public void onCreate() {
super.onCreate();
if (FinAppClient.INSTANCE.isFinAppProcess(this)) {
// The applet process does not perform any initialization operations
return;
}
// Collection of server information
List< FinStoreConfig> storeConfigs = new ArrayList<>();
// Information on Server 1
FinStoreConfig storeConfig1 = new FinStoreConfig(
"SDK Key Information" , // SDK Key
"SDK Secret information" , // SDK Secret
"Address of server 1" , // Server address
"Server 1's data upload server address" , // the address of the data upload server
"/api/v1/mop/" , // Server interface request routing prefix
"" ,
"encryption method" // encryption method, cc:SM, md5: MD5 (recommended)
);
storeConfigs.add(storeConfig1);
// Information on Server 2
FinStoreConfig storeConfig2 = new FinStoreConfig(
"SDK Key Information" , // SDK Key
"SDK Secret information" , // SDK Secret
"Address of server 2" , // Server address
"Server 2's data upload server address" , // the address of the data upload server
"/api/v1/mop/" , // Server interface request routing prefix
"" ,
"encryption method" // encryption method, cc:SM, md5: MD5 (recommended)
);
storeConfigs.add(storeConfig2);
FinAppConfig config = new FinAppConfig.Builder()
.setFinStoreConfigs(storeConfigs) // A collection of server information
.build();
FinAppClient.INSTANCE.init(this, config, new FinCallback<
Object>() {
@Override
public void onSuccess(Object result) {
}
@Override
public void onError(int code, String error) {
Toast.makeText(AppletApplication.this, "SDK initialization failed" , Toast.LENGTH_SHORT).show();
}
@Override
public void onProgress(int status, String error) {
}
});
}
}4. Exemplos de uso do SDK
4.1 Lançando o applet
Quando o applet estiver na plataforma, podemos abrir o applet por chamando a interface para iniciar o applet no sdk.O código para Iniciar o applet é o seguinte.
FinAppClient.INSTANCE.getAppletApiManager().startApplet(this, "5e0dc1f574193e00010d73c1" );Se o applet precisar ser lançado com o início-parâmetros up, um interface que suporta o início do início-parâmetros up podem ser chamados, como, como segue.
Map< String, String> params = new HashMap<>();
// path is the path to the applet page
params.put( "path" , "/pages/index/index" );
// query is the start parameter, with the content
"key1=value1&key2=value2 ..." in the form of
params.put( "query" , "aaa=test&bbb=123" );
FinAppClient.INSTANCE.getAppletApiManager().startApplet(this,
"5e0dc1f574193e00010d73c1" , params);4.2 Personalizando a interface do applet
A implementação de uma interface personalizada de applet requer a criação de uma classe que Herda de AbsApi e substituindo o método da tinta (a maioria notebly o apis() Método e o invoke() Método) no criado subclasse. A seguir é um exato de como implementar e registrar um applet Interface de customização abrindo uma página nativa dentro do applet.
- Primeiro, crie o
ApiOpenPageclasse, herança deAbsApiEntão então - então, o
apis()O método é substituído emApiOpenPagePara retornar Os nomes de todas as APIs que podem ser chamadas. Podemos adicionar vários API nomes para a matriz retonada porapis(), O exemplo atual adiciona apenas umopenPageEntão então 3.Finalmente, o Itinvoke()O método é substituído emApiOpenPagepara Implementar a lógica correspondente. Pular de página simples, ou seja, se oopenPageA interface é chamada no Applet, então uma atividade será iniciada no tamanho nativo.
package com.example.finogeeks.appletdemo.api;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import com.example.finogeeks.appletdemo.SecondActivity;
import com.finogeeks.lib.applet.api.AbsApi;
import com.finogeeks.lib.applet.interfaces.ICallback;
import org.json.JSONObject;
/**
* Custom applet interface for simple page jumps
*/
public class ApiOpenPage extends AbsApi {
private Context mContext;
public ApiOpenPage(Context context) {
mContext = context;
}
/**
* Returns an array of callable api names
*
* @return an array of callable api names
*/
@Override
public String[] apis() {
return new String[]{ "openPage" };
}
/**
* This method is triggered when the corresponding API call is received, and the business logic of the API is implemented in this method
*
* @param event event name, i.e.API name
* @param param event parameter
* @param callback Callback interface, used to call back the result
to the applet after executing the business logic
*/
@Override
public void invoke(String event, JSONObject param, ICallback
callback) {
if ( "openPage" .equals(event)) {
String url = param.optString( "url" );
if (! TextUtils.isEmpty(url)) {
Intent intent = new Intent();
intent.setClass(mContext, SecondActivity.class);
mContext.startActivity(intent);
callback.onSuccess(null);
} else {
callback.onFail();
}
}
}
}Depois de implementar a interface de applet personalizada, mais duas etapas ** são Exigido antes que a interface possa ser chamada no applet. 1.Randistem a interface de applet personalizada para o sdk.interface O registro é alcançado chamando o registerApi Método do IExtensionApiManager interface.
FinAppClient.INSTANCE.getExtensionApiManager().registerApi(new
ApiOpenPage(context));2.Ada uma configuração de interface personalizada para o Applet Project.crete um PhizClipConf.js Arquivo no diretório raiz do projeto de applet e configurar a interface personalizada correspondente em PhizClipConf.js com A seguinte configuração.
module.exports = {
extApi:[
{
name: 'openPage', // extension interface name
params: { // extend the interface parameters, you can list only the required parameters
url: ''
}
}
]
}4.3 Interagindo entre as páginas nativas e de applet
Quando o applet carrega uma página da web, se a página da web é ligar para o nativo Funcionalidade, o código nativo precisa ser registrado dentro do SDK em a forma de uma interface JSSDK personalizada. A interface JSSDK personalizada é Implementado da maneira ditada como interface de applet personalizada, ou seja, Herda de AbsApi e substitui o método da classe de tinta. A diferença é que o registerApi Método do IExtensionWebApiManager É chamado quando a interface é registrada, Em vez do método no IExtensionApiManager Então então
FinAppClient.INSTANCE.getExtensionWebApiManager().registerApi(new
WebApi(context));O SDK também suporta chamadas nativas para o JavaScript código na web pague da seguinte maneira.
FinAppClient.INSTANCE.getAppletApiManager().callJS( "appId" ,
"funcName" , "funParams" , 1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
result -> Toast.makeText(context, "callJS
successfully : " + result, Toast.LENGTH_SHORT).show(),
throwable -> Toast.makeText(context, "callJS failed :
" + throwable.getLocalizedMessage(), Toast.LENGTH_SHORT).show()
);5. SDK estendido
O exposto acima está de volta ao redor do sdk central finapplet . Em rosto, em Além do sdk central, também fornecemos um sdk de extensão, o branco é um Biblioteca que Relical no Core SDK e processe várias APIs de applet que não estão disponíveis no Core SDK. O motivo para provar um sdk de extensão é garantir que o núcleo SDK é leve o suficiente e a API de applet já está certa. O principal sdk é Responsável por configurar a estrutura básica para executar o aplicativo e Fornecendo um pequeno número das APIs mais inacessíveis, mantendo Somente permissões básicas, como armazenamento, câmera, geologia, etc. e Tem apenas um pouco mais de 1 MB de tamanho.
Obtenha o SDK estendido
Você pode baixar o arquivo Android SDK no [download de recursos Centro] (https://www.phizclip.com/downloads/) .O SDK estendido também é Incluído no arquivo zip de download.
Se você quiser usar a API no sdk de extensão, poderá confiar no Biblioteca SDK de extensão em Gradle em
implementation 'com.finogeeks.mop:plugins:x.y.z' //x.y.z must be replaced with the specific version number6. MAPSDK
O MAPSDK suporta o componente do mapa e o local. Ele roths no núcleo SDK como um complemento para o Map e Location
Funções. Os recursos de mapa e localização fornecidos dependem de um terceiro-Mapa da festa E SDK local, que suporta o uso de três complementos deGode Map|Gode Location ,,Baidu Map|Baidu Location e Google Map|Google LocationEntão então
Nota
Por favor, veja "Development-API-Location" para O suporte local da API das soluções Gaode, Baidu e Google.
6.1 Integração
- Dependência na Biblioteca Mapsdk em Gradle.
implementation 'com.finogeeks.mop:map:x.y.z' //x.y.z must be replaced with the specific version number- Desde o mapa e a capacidade de localização implementada por MapsDK depende no terceiro-Mapa da festa e local Para integrar o terceiro-Mapa da festa e local Registro de serviço, etc.
Nota
Selecione um dos seguintes fornecedores de SDK de terceiros para Incten SDKs da festa, por favor, consulte o escritório, documentação.
Confiança nas bibliotecas SDK de terceiros: (selecione um)
//Gaudet
implementation 'com.amap.api:3dmap:8.0.0' // you can replace it with the version number you need
implementation 'com.amap.api:location:5.5.1' // you can replace it with the version number you need
implementation 'com.amap.api:search:7.9.0' // you can replace it with the version number you need// Baidu
implementation 'com.baidu.lbsyun:BaiduMapSDK_Map:7.4.0' // you can replace it with the version number you need
implementation 'com.baidu.lbsyun:BaiduMapSDK_Location:9.1.8' // you can replace it with the version number you need
implementation 'com.baidu.lbsyun:BaiduMapSDK_Search:7.4.0' // you can replace it with the version number you need/Google
implementation 'com.google.android.gms:play-services-maps:16.1.0' //
this version is recommended and can be replaced with the version number
you need, but it is not supported above this version
implementation 'com.google.android.gms:play-services-location:16.0.0'
// this version is recommended and can be replaced with the version number you need, but it is not supported above this versionRegistre a API_KEY e o serviço do SDK de terceiros em AndroidManifest.xml : (Escolha um, dependendo do terceiro sdk você depende de)
//Gaudet
< meta-data
android:name= "com.amap.api.v2.apikey"
android:value= "The ApiKey you requested" />
< service android:name= "com.amap.api.location.APSService" />// Baidu
< meta-data
android:name= "com.baidu.lbsapi.API_KEY"
android:value= "The ApiKey you requested" />
< service
android:name= "com.baidu.location.f"
android:enabled= "true"
android:process= ":remote" />/Google
< meta-data
android:name= "com.google.android.geo.API_KEY"
android:value= "The ApiKey you requested" />Configure a arquitetura SOL da biblioteca suportada pelo terceiro SDK em build.gradle Então então
android {
defaultConfig {
ndk {
//Set the supported SO library architecture (you can select one or more platforms of so as required)
abiFilters "armeabi" , "armeabi-v7a" , "arm64-v8a" , "x86" ,
"x86_64"
}
}
}7. Bluetooth SDK
O uso da interface Bluetooth requer uma integração de seções do Bluetooth SDK, Onece Integrated the Interface entrará em vigor e não É necessária configuração. Método de integração.
implementation 'com.finogeeks.mop:bluetooth:x.y.z'8.SoundNet SDK
O usuário das interfaces relacionadas à Net Requer uma seção Integração do SoundNet SDK, que entrará em vigor assim que o Interfaces são integradas e nenhuma configuração é necessária. Método de integração.
implementation 'com.finogeeks.mop:agora:x.y.z'Se você usar a importação de AAR para aceitar o SDK, você precisará Adicione uma dependência adicional da rede sonora.
implementation 'io.agora.rtc:full-sdk:3.5.0'9.Webrtcsdk
Usando webrtc-Interfaces relacionadas requer uma seção webrtcsdk Integração, que entra em vigor uma quando a interface é integrada e Não requer configuração. Método de integração.
implementation 'com.finogeeks.mop:webrtc:x.y.z'Se você estiver usando a imagem AAR para aceitar, você precisará Para adicionar dependências WebRTC adicionais.
implementation 'org.webrtc:google-webrtc:1.0.32006'10. Contacte o SDK
O uso do controle-Interfaces relacionadas requer uma integração de seção do SDK de controle, que entra em vigor assim que a interface é integrada E não requer configuração. Método de integração.
implementation 'com.finogeeks.mop:contact:x.y.z'11.Clipboard SDK
Usando a área de transferência-Interfaces relacionadas requer uma integração de seção do sdk da área de transferência, o branco entra em vigor assim que a interface estiver Integrado e não requer configuração. Método de integração.
implementation 'com.finogeeks.mop:clipboard:x.y.z'12.PhizSDK
Aceita rápida para o Phiz SDK fornece a capacidade de ligar para o Phiz Para obter login, informações do usuário, número de telefone celular e pagamento via Appleto Phiz. Método de integração.
implementation 'com.finogeeks.mop:wechat:x.y.z'e adicione o ID do aplicativo Phiz que você solicitou na plataforma aberta do Phiz para o build.gradle Arquivo do seu projeto (por exemplo app/build.gradle ) NO
android {
// ...Other configurations omitted
defaultConfig {
// ...Other configurations omitted
resValue "string" , "phiz_sdk_app_id" , "Your Phiz SDKAPPID"
}
}Nota
Para usar o Phizsdk, você deve desviar que a versão sdk central seja 2.37.13 Ou acima.
Nota
Como o Phizsdk precisa substituir o open-type Métodos relacionados em o IAppletHandler , Especificamente chooseAvatar ,, contact ,, feedback ,, getPhoneNumber ,, launchApp ,, shareAppMessage Então então Então, se você implementou IAppletHandler e implementaram o Acima de seis métodos, Phizsdk assumirá o controle getPhoneNumber e a Os cinco métodos restantes serão migrados da seguinte forma, se você não tiver Implementd IAppletHandler ou não use o método de cerca de seis, você Pode ignorar isso. 1.Implem o IWeChatOpenTypeHandler interface.
class MyWeChatAppletOpenTypeHandler : IWeChatOpenTypeHandler {
override fun chooseAvatar(callback:
IAppletHandler.IAppletCallback) {
// The logic of your implementation
}
override fun contact(json: JSONObject): Boolean {
// The logic of your implementation
}
override fun feedback(bundle: Bundle): Boolean {
// The logic of your implementation
}
override fun launchApp(appParameter: String?): Boolean {
// The logic of your implementation
}
override fun shareAppMessage(
appInfo: String,
bitmap: Bitmap?
callback: IAppletHandler.
) {
// The logic of your implementation
}
}2.After the core SDK has been successfully initialised, set up your implementation class.(Note that, as with the core SDK, it is important to ensure that it is set up in the main process).
WechatopentypeClient.instance.iwechatopeEntypeHandler =
MywechatappleToPEntypeHandler ()