Android API can be implemented on mobile applications running on Android mobile or tablet devices. Simply include the provided .jar file into your existing application and add necessary codes to make your application into Smart View enabled one.
Android API Guide
Sample Apps
To use SmartviewSDK discover API
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
To prevent ProGuard , add the following lines in the proguard file
-dontwarn lombok.** -dontwarn com.samsung.multiscreen.BuildConfig -dontwarn javax.jmdns.impl.DNSCache
There are many features of the SDK and it's APIs. However, there are 3 main features that all Smart View apps need to implement.
From you mobile app, the first thing you'll want to do is find compatible TVs to interact with. Your mobile device and TV device need to be on the same WIFI network to work together. The mobile APIs provide a simple way to find TVs on your network. Typcially, you will use the APIs to start "scanning" the network for TVs and display a list to the user as they are found. Then allow the user to select a device to connect to.
The general mobile workflow is:
Example Android API Usage
// Get an instance of Search final Search search = Service.search(getContext()); // Add a listener for the onServiceFound event search.setOnServiceFoundListener( new OnServiceFoundListener() { @Override public void onFound(Service service) { Log.d(LOGTAG, "Search onFound() " + service.toString()); // Add service to a visual list where your user can select. // For display, we recommend that you show: service.getName() } } ); // Add a listener for the onServiceLost event search.setOnServiceLostListener( new OnServiceLostListener() { @Override public void onLost(Service service) { Log.d(LOGTAG, "Search onLost() " + service.toString()); // Remove this service from the display list } } ); // Add a listener for the onStop event search.setOnStopListener( new OnStopListener() { @Override public void onStop() { Log.d(LOGTAG, "Search onStop() services found: " + search.getServices().size()); } } ); // Start the discovery process with a timeout of 15 seconds. search.start(1500); // You can also stop the discovery process after some amount of time. Preferably once the user has selected a service to work with search.stop();
Before you can work with an installed TV app, you must first know the "id" of the TV application you want to work with. You can get your tv app id when you register your app in Samsung Apps.
Once the TV app has been released into Samsung Apps, you must use the supplied app id.
There are 4 core functions for working with installed tv apps
// Example app id String appId = "111299000796"; // Example channel id // This is your "communication" channel id. Your TV app must use the same channelId String channelId = "com.yourcompany.yourapp"; // Create an application instance. Application application = service.createApplication(appId, channelId); // Connect to the tv application. Note: This will also launch the tv application if not already launched application.connect(new Result<Client>() { @Override public void onSuccess(Client client) { Log.d(LOGTAG, "Application.connect onSuccess()"); // You can now send messages to the tv application } @Override public void onError(Error error) { Log.d(LOGTAG, "Application.connect onError() " + error.toString()); // Uh oh. Handle the error. if (error.getCode() == 404) { // tv app is not installed, you can install it now (see code below) } } }); // Disconnect from the application boolean stopTVApp = true;// if this is false, then the TV app will not stop application.disconnect(stopTVApp, new Result<Client>() { @Override public void onSuccess(Client client) { Log.d(LOGTAG, "Application.disconnect onSuccess()"); } @Override public void onError(Error error) { Log.d(LOGTAG, "Application.disconnect onError() " + error.toString()); } }); // Install the application on the TV. // Note: This will only bring up the installation page on the TV. // The user will still have to acknowledge by selecting "install" using the TV remote. application.install(new Result<Boolean>() { @Override public void onSuccess(Boolean result) { Log.d(LOGTAG, "Application.install onSuccess() " + result.toString()); } @Override public void onError(Error error) { Log.d(LOGTAG, "Application.install onError() " + error.toString()); // Uh oh. Handle the error. } });
Once your mobile application and TV application are connected, you can send messages to/from any or all clients connected including the TV.
For each message, you must supply a:
// Note: The TV application is designated as the "HOST" String messageId = "fireMissile"; String messageData = "{\"speed\":\"100\"}"; // Data can be any string including a json string // Send a message to the TV application only. application.publish(messageId, messageData, Message.TARGET_HOST); // Send a "broadcast" message to all clients EXCEPT yourself application.publish(messageId, messageData, Message.TARGET_BROADCAST); // Send a message to all clients INCLUDING yourself application.publish(messageId, messageData, Message.TARGET_ALL); // Send a message to a specific client (by id) ChannelClient client = channel.getClients().get(clientId); application.publish(messageId, messageData, client); // Send a message to a list of clients List<ChannelClient> clients = ... // You can create any combination list of clients application.publish(messageID, messageData, clients);
To receive incoming messages from another device, you need to add a message listener for messages that you expect to receive.
Received messages will include the message payload, and which client sent the message.
// Listen for a message by event application.addOnMessageListener("fireMissile", new OnMessageListener() { @Override public void onMessage(Message message) { Log.d(LOGTAG, "Application.onMessage() message: " + message.toString()); } });
There are several events that occur during the lifecycle of a Smart View application.
You can add listeners for any or all of them. Below are the recommended set of events to listen for.
// Listen for the connect event. This event is fired when "you" connect. application.setOnConnectListener(new OnConnectListener() { @Override public void onConnect(Client client) { Log.d(LOGTAG, "Application.onConnect() client: " + client.toString()); } }); // Listen for the disconnect event. This event is fired when "you" are disconnected application.setOnDisconnectListener(new OnDisconnectListener() { @Override public void onDisconnect(Client client) { Log.d(LOGTAG, "Application.onDisconnect() client: " + client.toString()); } }); // Listen for the client connect event. This even is fired when "another" client connects application.setOnClientConnectListener(new OnClientConnectListener() { @Override public void onClientConnect(Client client) { Log.d(LOGTAG, "Application.onClientConnect() client: " + client.toString()); } }); // Listen for the client disconnect event. This event is fired when "another" client disconnects application.setOnClientDisconnectListener(new OnClientDisconnectListener() { @Override public void onClientDisconnect(Client client) { Log.d(LOGTAG, "Application.onClientDisconnect() client: " + client.toString()); } }); // Listen for a message by event. This event is fired when an incoming messages is received. application.addMessageListener("fireMissile", new OnMessageListener() { @Override public void onMessage(Message message) { Log.d(LOGTAG, "Application.onMessage() message: " + message.toString()); } });