This repo is DEPRECATED. Check our newer Android SDK: https://github.com/webex/webex-android-sdk
The Cisco Spark™ Android SDK
The Cisco Spark Android SDK makes it easy to integrate secure and convenient Cisco Spark messaging and calling features in your Android apps.
This SDK is built with Android SDK Tools 27 and requires Android API Level 21 or later.
Assuming you already have an Android project, e.g. MySparkApp, for your Android app, here are the steps to integrate the Cisco Spark Android SDK into your project using Gradle:
-
Add the following repository to your top-level
build.gradle
file:allprojects { repositories { jcenter() maven { url 'https://devhub.cisco.com/artifactory/sparksdk/' } } }
-
Add the
spark-android-sdk
library as a dependency for your app in thebuild.gradle
file:dependencies { compile('com.ciscospark:androidsdk:1.4.0@aar', { transitive = true }) }
-
Enable multidex support for your app:
android { defaultConfig { multiDexEnabled true } }
-
Exclude rxjava.properties in your packagingOptions :
packagingOptions { exclude 'META-INF/rxjava.properties' }
To use the SDK, you will need Cisco Spark integration credentials. If you do not already have a Cisco Spark account, visit the Cisco Spark for Developers portal to create your account and register an integration. Your app will need to authenticate users via an OAuth grant flow for existing Cisco Spark users or a JSON Web Token for guest users without a Cisco Spark account.
See the Android SDK area of the Cisco Spark for Developers site for more information about this SDK.
Here are some examples of how to use the Android SDK in your app.
-
Create a new
Spark
instance using Spark ID authentication (OAuth-based):String clientId = "YOUR_CLIENT_ID"; String clientSecret = "YOUR_CLIENT_SECRET"; String scope = "spark:all"; String redirectUri = "Sparkdemoapp://response"; OAuthWebViewAuthenticator authenticator = new OAuthWebViewAuthenticator(clientId, clientSecret, scope, redirectUri); Spark spark = new Spark(activity.getApplication(), authenticator) if (!authenticator.isAuthorized()) { authenticator.authorize(webView, new CompletionHandler<Void>() { @Override public void onComplete(Result<Void> result) { if (!result.isSuccessful()) { System.out.println("User not authorized"); } } }); }
-
Create a new
Spark
instance using Guest ID authentication (JWT-based):JWTAuthenticator authenticator = new JWTAuthenticator(); Spark spark = new Spark(activity.getApplication(), authenticator); if (!authenticator.isAuthorized()) { authenticator.authorize(myJwt); }
-
Register the device to send and receive calls:
spark.phone().register(new CompletionHandler<Void>() { @Override public void onComplete(Result<Void> result) { if (result.isSuccessful()) { // Device registered } else { // Device not registered, and calls will not be sent or received } } });
-
Create a new Cisco Spark space, add users to the space, and send a message:
// Create a Cisco Spark space: spark.rooms().create("Hello World", null, new CompletionHandler<Room>() { @Override public void onComplete(Result<Room> result) { if (result.isSuccessful()) { Room room = result.getData(); } else { SparkError error = result.getError(); } } }); // Add a user to a space: spark.memberships().create(roomId, null, "person@example.com", true, new CompletionHandler<Membership>() { @Override public void onComplete(Result<Membership> result) { if (result.isSuccessful()) { Membership membership = result.getData(); } else { SparkError error = result.getError(); } } }); // Send a message to a space: spark.messages().post(roomId, null, null, "Hello there", null, null, new CompletionHandler<Message>() { @Override public void onComplete(Result<Message> result) { if (result.isSuccessful()) { Message message = result.getData(); } else { SparkError error = result.getError(); } } });
-
Make an outgoing call:
spark.phone().dial("person@example.com", MediaOption.audioVideo(local, remote), new CompletionHandler<Call>() { @Override public void onComplete(Result<Call> result) { Call call = result.getData(); if (call != null) { call.setObserver(new CallObserver() { @Override public void onRinging(Call call) { } @Override public void onConnected(Call call) { } @Override public void onDisconnected(CallDisconnectedEvent callDisconnectedEvent) { } @Override public void onMediaChanged(MediaChangedEvent mediaChangedEvent) { } }); } else { SparkError error = result.getError(); } } });
-
Receive a call:
spark.phone().setIncomingCallListener(new Phone.IncomingCallListener() { @Override public void onIncomingCall(Call call) { call.answer(MediaOption.audioVideo(local, remote), new CompletionHandler<Void>() { @Override public void onComplete(Result<Void> result) { if (result.isSuccessful()) { // success } else { SparkError error = result.getError(); } } }); } });
-
Make an room call:
spark.phone().dial(roomId, MediaOption.audioVideoSharing(new Pair<>(localView,remoteView),shareView), new CompletionHandler<Call>() { @Override public void onComplete(Result<Call> result) { Call call = result.getData(); if (call != null) { call.setObserver(new CallObserver() { @Override public void onConnected(Call call) { } //... @Override public void onCallMembershipChanged(CallMembershipChangedEvent callMembershipChangeEvent) { CallMembership membership = callMembershipChangeEvent.getCallMembership(); if (callMembershipChangeEvent instanceof MembershipJoinedEvent) { } else if (callMembershipChangeEvent instanceof MembershipLeftEvent) { } else if (callMembershipChangeEvent instanceof MembershipDeclinedEvent) { } else if (callMembershipChangeEvent instanceof MembershipSendingVideoEvent) { } else if (callMembershipChangeEvent instanceof MembershipSendingAudioEvent) { } else if (callMembershipChangeEvent instanceof MembershipSendingSharingEvent) { } } }); } else { SparkError error = result.getError(); } } });
-
Receive screen share:
spark.phone().dial(roomId, MediaOption.audioVideoSharing(new Pair<>(localView,remoteView),shareView), new CompletionHandler<Call>() { @Override public void onComplete(Result<Call> result) { Call call = result.getData(); if (call != null) { call.setObserver(new CallObserver() { @Override public void onConnected(Call call) { } //... @Override public void onMediaChanged(MediaChangedEvent mediaChangedEvent) { if (mediaChangedEvent instanceof RemoteSendingSharingEvent) { if (((RemoteSendingSharingEvent) mediaChangedEvent).isSending()) { mediaChangedEvent.getCall().setSharingRenderView(shareView); } else if (!((RemoteSendingSharingEvent) mediaChangedEvent).isSending()) { mediaChangedEvent.getCall().setSharingRenderView(null); } } } }); } else { SparkError error = result.getError(); } } });
-
Start/stop sharing screen:
activeCall.startSharing(r -> Ln.d("startSharing result: " + r)); boolean isSharing = activeCall.isSendingSharing(); activeCall.stopSharing(r -> Ln.d("stopSharing result: " + r));
-
Post a message
spark.message().post( idOrEmail, // person id, email or room id message, // text message to be sent mentions, // list of Mention object files, // list of files to be sent new CompletionHandler<Message>() { @Override public void onComplete(Result<Message> result) { if (result.isSuccessful()) { // message sent success } else { // message sent failed } } }));
-
Receive a message
spark.message().setMessageObserver( new MessageObserver() { void onEvent(MessageEvent event) { if (event instanceof MessageArrived) { Message message = event.getMessage(); // new message arrived } else if (event instanceof MessageDeleted) { // message deleted } } } );
Pull requests welcome. To suggest changes to the SDK, please fork this repository and submit a pull request with your changes. Your request will be reviewed by one of the project maintainers.
© 2016-2018 Cisco Systems, Inc. and/or its affiliates. All Rights Reserved.
See LICENSE for details.