Beruflich Dokumente
Kultur Dokumente
Network Communication
Versión: 6.0
Guía de desarrollo
Publicado: 2011-02-16
SWD-1327377-0217050809-005
Contenido
1 Descripción general de comunicación de red................................................................................................... 3
2 API de comunicación......................................................................................................................................... 4
Comunicar con servidores HTTP....................................................................................................................... 5
Solicitar datos mediante un objeto BlockingSenderDestination............................................................... 6
Solicitar datos mediante un objeto NonBlockingSenderDestination........................................................ 7
Enviar datos mediante un objeto FireAndForgetDestination.................................................................... 10
Analizar un formato de datos común de Internet..................................................................................... 11
Suscribirse a un iniciador push......................................................................................................................... 11
Suscribirse a un iniciador push.................................................................................................................. 12
Enviar información de inicio de sesión a un servidor HTTP.............................................................................. 13
3 Transportes de red............................................................................................................................................ 15
Arquitectura: transportes de red...................................................................................................................... 15
Utilizar BlackBerry Enterprise Server como gateway de intranet..................................................................... 17
Utilizar el gateway de Internet de un proveedor de servicios inalámbricos..................................................... 18
4 Conexiones de red............................................................................................................................................ 19
API de red......................................................................................................................................................... 20
Elegir transportes de red mediante la API de red...................................................................................... 20
Abrir una conexión de red mediante la API de red.................................................................................... 21
Marco genérico de conexión (GCF)................................................................................................................... 23
Abrir una conexión de red mediante el GCF.............................................................................................. 23
Enviar y recibir datos mediante una conexión de red...................................................................................... 25
Opciones de transporte de red......................................................................................................................... 28
6 Ejemplos de código........................................................................................................................................... 32
Muestra de código: solicitar datos mediante un objeto BlockingSenderDestination...................................... 32
Muestra de código: solicitar datos mediante un objeto NonBlockingSenderDestination................................ 34
Muestra de código: análisis de una estructura de datos de JSON.................................................................... 36
Muestra de código: recuperar una página Web mediante el API de red.......................................................... 40
Muestra de código: recuperar una página Web mediante el GCF.................................................................... 43
Muestra de código: determinar los transportes de red con cobertura suficiente mediante la API de red...... 46
Muestra de código: control de radios............................................................................................................... 47
Muestra de código: determinar el estado de un transporte de red mediante la API de red........................... 50
7 Glosario............................................................................................................................................................. 52
8 Comentarios..................................................................................................................................................... 55
10 Aviso legal......................................................................................................................................................... 57
Guía de desarrollo Descripción general de comunicación de red
Versión de
API Descripción BlackBerry
Device Software
API de comunicación La API de comunicación encapsula todas las operaciones 6.0 y posterior
requeridas para conectarse a un servidor HTTP situado en
Internet o detrás de un firewall de la empresa.
API de red La API de red ofrece una interfaz sencilla para acceder a 5.0 y posterior
muchas opciones relacionadas con la conexión y los
transportes de red.
Marco genérico de conexión El GCF ofrece una manera flexible de crear conexiones a la 4.0 y posterior
(GCF) red mediante el transporte de su elección.
Además de la funcionalidad que cada API ofrece, debe tener en cuenta si la API existe en la versión de BlackBerry®
Device Software que probablemente ejecuten sus dispositivos de destino. Por ejemplo, la API de comunicación
requiere BlackBerry Device Software 6.0. Debería escribir su propio código para realizar tareas similares en los
dispositivos que ejecuten BlackBerry Device Software 5.0 y anterior.
La solución BlackBerry también activa aplicaciones de servidor para insertar datos por push de forma proactiva en
dispositivos BlackBerry de un modo sumamente seguro y fiable.
3
Guía de desarrollo API de comunicación
API de comunicación 2
La API de Comunicación simplifica el proceso de interactuación con servicios Web y otras aplicaciones. Los objetos
que crea mediante esta API automatizan el proceso de búsqueda de un transporte de red disponible, creación de
una conexión segura para subprocesos y negociación de un intercambio de datos con el punto final del URI o la
dirección URL que especifique. La API se implementa en el paquete net.rim.device.api.io.messaging.
Dentro de la API de comunicación, los puntos finales del URI y la dirección URL se denominan destinos. Puede utilizar
objetos que implementen la interfaz de SenderDestination para enviar los datos a un servicio Web y acceder a
la respuesta. De forma similar, puede utilizar objetos que implementen la interfaz de ReceiverDestination para
suscribirse a un servicio push y ofrecer el acceso a mensajes nuevos de ese servicio. Debe utilizar la clase de
DestinationFactory para crear un objeto que implemente una de las subinterfaces de Destination que mejor
satisfaga sus requisitos.
Interfaz Descripción
BlockingSenderDestination Puede utilizar esta interfaz para enviar un mensaje a un servicio
Web, pero este objeto bloquea la ejecución de subprocesos
mientras espera una respuesta del servicio Web.
Alternativamente, BlockingSenderDestination puede
devolver un objeto de MessageFuture. Esto permite la ejecución
del subproceso para continuar hasta que invoque uno de los
métodos de get() del MessageFuture.
Cuando invoca sendReceive() en
BlockingSenderDestination para enviar un mensaje y espera
una respuesta, no lo debe invocar desde el subproceso de evento
principal.
NonBlockingSenderDestination Puede utilizar esta interfaz para enviar un mensaje a un servicio
web. En la lista de parámetros, pase su implementación de la
interfaz de MessageListener para recibir la respuesta del
servicio Web.
BlockingReceiverDestination Puede utilizar esta interfaz para suscribirse a un servicio push y
bloquear la ejecución de subprocesos hasta que reciba la
confirmación de su solicitud de suscripción.
NonBlockingReceiverDestination Puede utilizar esta interfaz para suscribirse a un servicio push. En
la lista de parámetros, pase su implementación de
MessageListener para recibir mensajes push.
FireAndForgetDestination Puede utilizar esta interfaz para enviar los datos a un servicio Web
cuando no espere una respuesta.
4
Guía de desarrollo Comunicar con servidores HTTP
Los datos que envía a y recibe de un servicio Web se ajustan en un objeto de Message. Puede establecer los
encabezados y el contenido de los datos que envía a un servicio Web en el objeto Message. Alternativamente, puede
permitir que la API de comunicación elija valores predeterminados razonables para su solicitud. Por ejemplo, puede
solicitar una página Web invocando SenderDestination.send() sin especificar un comando HTTP GET.
También puede indicar a la API que analice automáticamente los datos de la respuesta de un servicio Web. Si
implementa la interfaz de MessageProcessor con su clase de analizador, puede suministrar su objeto analizador
al método en DestinationFactory que crea su objeto de Destination. A continuación puede recuperar la
respuesta analizada mediante Message.getObjectPayload().
Los paquetes de net.rim.device.api.io.parser contienen procesadores de mensajes para una gran variedad
de formatos de datos estándar utilizados en el Internet. Los paquetes incluyen analizadores para:
• JSON
• RSS (RDF, Atom)
• SOAP
• XML
Para mejorar la eficiencia, la API de Comunicación ofrece respuestas largas desde servicios Web en un objeto de
InputStream. Una aplicación puede solicitar datos adicionales según sea necesario en lugar de descargar una gran
cantidad de datos de una sola vez y almacenarla en la memoria del dispositivo. Este enfoque le permite hacer un
mejor uso tanto del banda de la red como de la memoria.
5
Guía de desarrollo Comunicar con servidores HTTP
Después de enviar su mensaje, puede que necesite escuchar una respuesta. Para objetos de
BlockingSenderDestination, debe crear un objeto de Thread cuando invoca uno de los métodos de
sendReceive(). Para objetos de NonBlockingSenderDestination, debe crear un objeto de
MessageListener para recibir la respuesta.
En cualquier caso, debe procesar un objeto de Message que contenga la respuesta. De forma predeterminada, el
cuerpo del Message contiene los datos sin procesar de respuesta. Puede elegir especificar un procesador de mensajes
del paquete de net.rim.device.api.io.parser o crear el suyo propio mediante la interfaz de
MessageProcessor.
6
Guía de desarrollo Comunicar con servidores HTTP
if(bsd == null)
{
bsd = DestinationFactory.createBlockingSenderDestination
(new Context("MyContext"), uri);
}
8. Envíe un mensaje y espere la respuesta.
response = bsd.sendReceive();
9. Si el servicio Web envía una respuesta, procésela.
if(response != null)
{
processResponse(response);
}
}
10. Revise cualquier error que se produzca si el mensaje no se pudo enviar por alguna razón.
catch (Exception e)
{
// Process the error
}
11. Publique el BlockingSenderDestination.
finally
{
if(bsd != null)
{
bsd.release();
}
}
}
});
12. Inicie el subproceso.
t.start();
Después de terminar: Si su processResponse() actualiza la IU, debe hacer lo mismo en el subproceso de evento
principal, no en el subproceso que usted creó en esta tarea. Para obtener más información, lea el artículo de la base
de conocimientos en http://supportforums.blackberry.com/t5/Java-Development/Manage-UI-interactions/ta-p/
502378.
Puede ver una muestra de código completo, en "Muestra de código: solicitar datos mediante un objeto
BlockingSenderDestination"
7
Guía de desarrollo Comunicar con servidores HTTP
8
Guía de desarrollo Comunicar con servidores HTTP
9
Guía de desarrollo Comunicar con servidores HTTP
10
Guía de desarrollo Suscribirse a un iniciador push
Ejemplo de código
La muestra de código siguiente demuestra las tres acciones requeridas para recuperar un objeto de Java que contenga
una estructura de datos JSON.
import net.rim.device.api.io.messaging.*
import net.rim.device.api.io.parser.json.*
// Specify a MessageProcessor when you create your Destination
BlockingSenderDestination bsd = DestinationFactory(myContext, myURI,
new JSONMessageProcessor());
// Retrieve the response
Message response = bsd.sendReceive();
// Extract the Java object that contains the JSON data structure
Object payload = response.getObjectPayload();
11
Guía de desarrollo Suscribirse a un iniciador push
Componente Descripción
SenderDestination Este componente envía el mensaje de suscripción
al proveedor del contenido. Este componente es
opcional. Puede enviar un mensaje de suscripción
mediante cualquier tipo de conexión de red. Por
ejemplo, puede utilizar la API de red para crear un
HTTPConnection y enviar los parámetros de
suscripción manualmente.
Mensaje de suscripción La API de comunicación puede crear un mensaje de
suscripción con el formato adecuado por usted.
Puede invocar
BpsSubscriptionMessageBuilder.createB
yteSubscriptionMessage() para recuperar un
objeto de ByteMessage configurado para su
SenderDestination,
NonBlockingReceiverDestination y el
MessageListener donde quiere recibir los
mensajes push entrantes.
NonBlockingReceiverDestination Este componente asocia un URI particular con el
MessageListener donde quiere recibir los
mensajes push entrantes y un objeto de
InboundDestinationConfiguration.
InboundDestinationConfiguration Este componente especifica diversos parámetros
de servicios de push, como un indicador que
especifica si su aplicación debe iniciarse cuando
llega un mensaje de push nuevo. Puede crear un
InboundDestinationConfiguration
mediante la clase de
InboundDestinationConfigurationFactor
y.
MessageListener Este componente procesa los mensajes push
entrantes.
Antes de comenzar: Obtenga un identificador de aplicación y el número de puerto local que su aplicación debe utilizar
para buscar mensajes entrantes. Proporcione estos detalles al proveedor de contenido que crea la aplicación push
de servidor.
12
Guía de desarrollo Enviar información de inicio de sesión a un servidor HTTP
13
Guía de desarrollo Enviar información de inicio de sesión a un servidor HTTP
Ejemplo de código
14
Guía de desarrollo Transportes de red
Transportes de red 3
Arquitectura: transportes de red
Un dispositivo BlackBerry® puede conectarse a una red inalámbrica mediante transportes diferentes. No todos los
dispositivos tienen acceso a todos los transportes. Por ejemplo, el transporte BlackBerry® Mobile Data Systemestá
sólo disponible para dispositivos registrados con un BlackBerry® Enterprise Server.
15
Guía de desarrollo Arquitectura: transportes de red
16
Guía de desarrollo Utilizar BlackBerry Enterprise Server como gateway de intranet
17
Guía de desarrollo Utilizar el gateway de Internet de un proveedor de servicios inalámbricos
18
Guía de desarrollo Conexiones de red
Conexiones de red 4
BlackBerry® Application Platform ofrece dos API que puede utilizar para crear conexiones a la red manualmente: la
API de red y el GCF. Las aplicaciones enfocadas a dispositivos BlackBerry® con BlackBerry® Device Software 5.0 y
posterior pueden utlizar la API de red. La API de red ofrece una interfaz sencilla para trabajar con los transportes de
red y para configurar una amplia gama de parámetros de conexión. Puede utilizar el GCF para crear conexiones a la
red en dispositivos que ejecuten versiones anteriores de BlackBerry Device Software. Sin embargo, usar el GCF
requiere conocer más API de BlackBerry® para descubrir los transportes disponibles y cómo configurarlos.
Sea cual sea la API elegida, el proceso de crear una conexión de red es semejante. Primero, abra una conexión de
red, a continuación, lea y escriba datos medainte esa conexión y, por último, cierre la conexión. Antes de abrir una
conexión, normalmente especificará un transporte, un protocolo y un punto final. Puede conectarse a recursos de
red mediante una gran variedad de protocolos. Sin embargo, sepa que no todos los transportes admiten todos los
protocolos. Por ejemplo, WAP 1.0 y 1.1 sólo admiten HTTP sobre WAP y HTTPS sobre WAP o WTLS. BlackBerry
Application Platform admite los protocolos siguientes:
• HTTP
• HTTPS
• socket
• TLS
• SSL
• UDP (Datagrama)
El protocolo y el punto final los determina su aplicación, pero el transporte lo determina el entorno operativo de sus
usuarios. Puede que necesite probar más de un transporte antes de poder hacer una conexión correcta. La tabla
siguiente sugiere las órdenes de la preferencia para aplicaciones de empresa y de consumo.
19
Guía de desarrollo API de red
Después de abrir una conexión, recibe un objeto de Connection que representa su conexión. El paquete de
javax.microedition.io contiene varias interfaces que puede utilizar para manipular un objeto de Connection.
Interfaz Descripción
HttpConnection Esta interfaz ofrece métodos para establecer el método de solicitud HTTP
(GET, POST, etcétera) y los encabezados, y enviar y recibir datos por la
conexión.
HttpsConnection Esta interfaz incluye todos los métodos en la interfaz de HttpConnection
y añade getSecurityInfo(), que devuelve el certificado suministrado
por el servidor Web.
SocketConnection Esta interfaz expone los métodos de envío de datos a y recibe los datos de
un host de la red mediante una conexión de socket.
SecureConnection Esta interfaz ofrece métodos para crear conexiones de socket TLS y SSL. Esta
interfaz incluye todos los métodos en la interfaz de SocketConnection y
añade getSecurityInfo(), que devuelve información de seguridad
sobre la conexión.
UDPDatagramConnection Esta interfaz ofrece métodos para recuperar información sobre la conexión
y crear objetos de datagrama nuevos.
InputConnection, Estas interfaces ofrecen acceso a las secuencias de datos de entrada y de
OutputConnection salida de una conexión.
Cuando esté listo para utilizar su conexión, lance el objeto de Connection según el protocolo que usó para abrir la
conexión. Necesitará las interfaces del InputConnection y el OutputConnection del paquete
javax.microedition.io para acceder a las funciones de envío y recepción del objeto de Connection. Esas
interfaces exponen las secuencias de datos de entrada y de salida del objeto de Connection. Para obtener más
información acerca de cómo enviar los datos mediante la conexión, consulte las clases de InputStream y
OutputStream en la referencia de API para BlackBerry® Java® SDK.
API de red
La API de red se implementa en el net.rim.device.api.io.transport y en los paquetes de
net.rim.device.api.io.transport.options . La mayoría de las funciones la proporciona el
ConnectionFactory y las clases de TransportInfo . Un objeto de ConnectionFactory devuelve un objeto
de ConnectionDescriptor que contiene un objeto de Connection y la información sobre el transporte a través
del cual se abrió la conexión.
20
Guía de desarrollo API de red
Si no proporciona una lista ordenada de transportes preferidos cuando abre una conexión, la API de red elige un
transporte por usted. Sin embargo, debe priorizar los transportes que su aplicación utilice según el tipo de usuario
objetivo de la misma. La API recorre una serie de tipos de transporte que establezca usted mediante
ConnectionFactory.setPreferredTransportTypes().
Después que enumere sus transportes preferidos, debe establecer las opciones para cualquier transporte que
requiere unas específicas. Por ejemplo, los transportes WAP 1.0 y 1.1 requieren información sobre un APN, la
autenticación de gateway, etcétera. Para obtener más información, consulte "Opciones de transporte de red".
También debe crear un objeto de CoverageStatusListener (en el paquete de
net.rim.device.api.io.transport), y registrarlo mediante TransportInfo.addListener(). El dispositivo
envía notificaciones a su aplicación acerca de los cambios en el estado de la cobertura para que su aplicación pueda
responder de forma adecuada.
21
Guía de desarrollo API de red
int[] intTransports =
{ TransportInfo.TRANSPORT_TCP_WIFI,
TransportInfo.TRANSPORT_WAP2,
TransportInfo.TRANSPORT_TCP_CELLULAR
}
3. Configure las opciones para el transporte TCP móvil si se aplica.
TcpCellularOptions tcpOptions = new TcpCellularOptions();
if(!TcpCellularOptions.isDefaultAPNSet())
{
tcpOptions.setApn("My APN");
tcpOptions.setTunnelAuthUsername("user");
tcpOptions.setTunnelAuthPassword("password");
}
4. Cree un objeto de ConnectionFactory.
ConnectionFactory factory = new ConnectionFactory();
5. Configure cualquier otra opción de ConnectionFactory aplicable a su aplicación. En este caso, TCP móvil es
uno de los transportes preferidos, así que configrue las opciones de transporte TCP móvil.
factory.setTransportTypeOptions(TransportInfo.TRANSPORT_TCP_CELLULAR, tcpOptions);
factory.setAttemptsLimit(5);
6. Cree un subproceso para recuperar la conexión. Si logró establecer la conexión, a continuación
ConnectionFactory devuelve un objeto de ConnectionDescriptor que puede utilizar. En este paso, pase
el objeto de ConnectionDescriptor método (displayContent()) que será responsable de mostrar el
contenido.
Thread t = new Thread(new Runnable()
{
public void run()
{
ConnectionDescriptor cd = _factory.getConnection
("http://www.blackberry.com");
if(cd != null)
{
Connection c = cd.getConnection();
displayContent(c);
}
}
});
t.start();
7. Implemente displayContent(). En este caso, envíe una pantalla que utilice un parámetro de Connection
para recuperar y mostrar el contenido, después de que el subproceso de recuperación de la conexión finalice.
private void displayContent(final Connection conn)
{
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run() {
UiApplication.getUiApplication().pushScreen(new HTTPOutputScreen(conn));
22
Guía de desarrollo Marco genérico de conexión (GCF)
}
});
}
Después de terminar: Para obtener más información acerca cómo usar una conexión e implementar la clase de
HTTPOutputScreen, consulte "Enviar y recibir datos mediante una conexión de red".
Para ver una muestra de código completo, consulte "Muestra de código: recuperar una página Web mediante la API
de red".
HTTPConnection c = (HTTPConnection)Connector.open("http://
example.com;interface=wifi");
23
Guía de desarrollo Marco genérico de conexión (GCF)
Después de terminar: Para obtener más información acerca cómo usar una conexión e implementar la clase de
HTTPOutputScreen, consulte "Enviar y recibir datos mediante una conexión de red".
Para ver una muestra de código completo, consulte "Muestra de código: recuperar una página Web mediante el GCF".
24
Guía de desarrollo Enviar y recibir datos mediante una conexión de red
25
Guía de desarrollo Enviar y recibir datos mediante una conexión de red
}
});
}
7. En una clase interna, cree un subproceso para que se comunique con el servidor Web. Acepte un objeto de
ConnectionDescriptor como argumento.
26
Guía de desarrollo Enviar y recibir datos mediante una conexión de red
27
Guía de desarrollo Opciones de transporte de red
28
Guía de desarrollo Opciones de transporte de red
29
Guía de desarrollo Trabajar con radios
30
Guía de desarrollo Consultar la disponibilidad de la radio y cambiar su estado
5. Compruebe si la radio que quiere utilizar está desactivada. Si lo está, se aplican un orden de bits Y una operación
a intActiveWAFs y la constante para la radio devuelve 0.
if ((intActiveWAFs & RadioInfo.WAF_WLAN) = 0)
{
6. Si la radio está desactivada, actívela.
Radio.activateWAFs(RadioInfo.WAF_WLAN);
}
}
31
Guía de desarrollo Ejemplos de código
Ejemplos de código 6
Muestra de código: solicitar datos mediante un objeto
BlockingSenderDestination
import net.rim.device.api.io.messaging.*;
import net.rim.device.api.io.URI;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import java.io.*;
public class NetworkSample extends UiApplication
{
public static void main(String[] args)
{
NetworkSample app = new NetworkSample();
app.enterEventDispatcher();
}
public NetworkSample()
{
pushScreen(new BlockingSenderSample());
}
}
class BlockingSenderSample extends MainScreen implements FieldChangeListener
{
ButtonField _btnBlock = new ButtonField(Field.FIELD_HCENTER);
private static UiApplication _app = UiApplication.getUiApplication();
private String _result;
public BlockingSenderSample()
{
_btnBlock.setChangeListener(this);
_btnBlock.setLabel("Fetch page");
add(_btnBlock);
}
public void fieldChanged(Field button, int unused)
{
if(button == _btnBlock)
{
Thread t = new Thread(new Runnable()
{
public void run()
{
Message response = null;
String uriStr = "http://www.blackberry.com";
BlockingSenderDestination bsd = null;
try
{
bsd = (BlockingSenderDestination)
DestinationFactory.getSenderDestination
("CommAPISample", URI.create(uriStr));
if(bsd == null)
{
bsd =
32
Guía de desarrollo Muestra de código: solicitar datos mediante un objeto BlockingSenderDestination
DestinationFactory.createBlockingSenderDestination
(new Context("CommAPISample"),
URI.create(uriStr)
);
}
// Send message and wait for response
response = bsd.sendReceive();
if(response != null)
{
BSDResponse(response);
}
}
catch(Exception e)
{
// process the error
}
finally
{
if(bsd != null)
{
bsd.release();
}
}
}
});
t.start();
}
}
private void BSDResponse(Message msg)
{
if (msg instanceof ByteMessage)
{
ByteMessage reply = (ByteMessage) msg;
_result = (String) reply.getStringPayload();
} else if(msg instanceof StreamMessage)
{
StreamMessage reply = (StreamMessage) msg;
InputStream is = reply.getStreamPayload();
byte[] data = null;
try {
data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
} catch (IOException e) {
// process the error
}
if(data != null)
{
_result = new String(data);
}
}
_app.invokeLater(new Runnable() {
public void run() {
_app.pushScreen(new HTTPOutputScreen(_result));
}
});
}
}
33
Guía de desarrollo Muestra de código: solicitar datos mediante un objeto NonBlockingSenderDestination
34
Guía de desarrollo Muestra de código: solicitar datos mediante un objeto NonBlockingSenderDestination
add(_btnNonBlock);
}
public void fieldChanged(Field button, int unused)
{
if(button == _btnNonBlock)
{
NonBlockingSenderDestination destination = null;
try
{
URI uri = URI.create("http://www.blackberry.com");
NBSDMsgListener responseListener = new NBSDMsgListener();
destination = (NonBlockingSenderDestination)
DestinationFactory.getSenderDestination
("CommAPISample", uri);
if (destination == null)
{
destination =
DestinationFactory.createNonBlockingSenderDestination
(new Context("CommAPISample"), uri, responseListener);
}
// Send message to retrieve the response
destination.send();
}
catch(Exception e)
{
// process the error
}
}
}
}
class NBSDMsgListener implements MessageListener
{
public void onMessage(Destination dest, Message msg)
{
String payload = null;
if (msg instanceof ByteMessage)
{
ByteMessage reply = (ByteMessage) msg;
payload = (String) reply.getStringPayload();
} else if(msg instanceof StreamMessage)
{
StreamMessage reply = (StreamMessage) msg;
InputStream is = reply.getStreamPayload();
byte[] data = null;
try {
data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
} catch (IOException e) {
}
if(data != null)
{
payload = new String(data);
}
}
if(payload!=null)
{
synchronized(Application.getEventLock())
35
Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON
{
UiApplication.getUiApplication().pushScreen
(new HTTPOutputScreen(payload));
}
}
}
public void onMessageCancelled(Destination arg0, int arg1)
{
// process message cancelled notification
}
public void onMessageFailed(Destination arg0, MessageFailureException arg1)
{
// process message failed notification
}
}
class HTTPOutputScreen extends MainScreen
{
RichTextField _rtfOutput = new RichTextField();
public HTTPOutputScreen(String message)
{
_rtfOutput.setText("Retrieving data. Please wait...");
add(_rtfOutput);
showContents(message);
}
// After the data has been retrieved, display it
public void showContents(final String result) {
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
_rtfOutput.setText(result);
}
});
}
}
import net.rim.device.api.io.URI;
import net.rim.device.api.io.messaging.*;
import net.rim.device.api.ui.*
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import java.io.*;
import org.json.me.*;
public class NetworkSample extends UiApplication
{
public static void main(String[] args)
{
36
Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON
37
Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
if(bsd != null)
{
bsd.release();
}
}
}
});
t.start();
}
}
class JSONOutputScreen extends MainScreen implements TreeFieldCallback
{
private TreeField _treeField;
public JSONOutputScreen(Object JSONData)
{
_treeField = new TreeField(this, Field.FOCUSABLE);
add(_treeField);
setTree(JSONData);
}
void setTree(Object obj)
{
int parentNode = 0;
_treeField.deleteAll();
try
{
if(obj instanceof JSONArray)
{
parentNode = populateTreeArray
(_treeField, (JSONArray) obj, parentNode);
}
else if(obj instanceof JSONObject)
{
parentNode = populateTreeObject
(_treeField, (JSONObject) obj, parentNode);
}
}
catch(JSONException e)
{
System.out.println(e.toString());
}
_treeField.setCurrentNode(parentNode);
}
// Populate the trees with JSON arrays
int populateTreeArray(TreeField tree, JSONArray o, int p) throws JSONException
{
Object temp;
int newParent;
newParent = tree.addChildNode(p, "Array " + p);
for(int i = 0; i < o.length(); ++i)
{
38
Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON
temp = o.get(i);
if(temp == null || temp.toString().equalsIgnoreCase("null"))
{
continue;
}
if(temp instanceof JSONArray)
{
// Array of arrays
populateTreeArray(tree, (JSONArray) temp, newParent);
}
else if(temp instanceof JSONObject)
{
// Array of objects
populateTreeObject(tree, (JSONObject) temp, newParent);
}
else
{ // other values
newParent = tree.addSiblingNode(newParent, temp.toString());
}
}
return newParent;
}
// Populate the tree with JSON objects
int populateTreeObject(TreeField tree, JSONObject o, int p) throws JSONException
{
Object temp;
int newParent = tree.addChildNode(p, "Object" + p);
JSONArray a = o.names();
for(int i = 0; i < a.length(); ++i)
{
temp = o.get(a.getString(i));
if(temp == null || temp.toString().equalsIgnoreCase("null"))
{
continue;
}
if(temp instanceof JSONArray)
{
populateTreeArray(tree, (JSONArray) temp, newParent);
}
else if(temp instanceof JSONObject)
{
populateTreeObject(tree, (JSONObject) temp, newParent);
}
else
{
tree.addSiblingNode
(newParent, a.getString(i) + ": " + temp.toString());
}
}
return newParent;
}
public void drawTreeItem(TreeField treeField, Graphics graphics, int node,
int y, int width, int indent)
{
if(treeField == _treeField)
{
39
Guía de desarrollo Muestra de código: recuperar una página Web mediante el API de red
import net.rim.device.api.io.transport.*;
import net.rim.device.api.io.transport.options.*;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.util.Arrays;
import java.io.*;
import javax.microedition.io.*;
public class NetworkSample extends UiApplication
{
public static void main(String[] args)
{
NetworkSample app = new NetworkSample();
app.enterEventDispatcher();
}
public NetworkSample()
{
new HTTPConnectionSetup();
}
}
class HTTPConnectionSetup
{
ConnectionFactory _factory = new ConnectionFactory();
public HTTPConnectionSetup()
{
// Create preference ordered list of transports
int[] _intTransports =
{ TransportInfo.TRANSPORT_TCP_WIFI,
TransportInfo.TRANSPORT_WAP2,
TransportInfo.TRANSPORT_TCP_CELLULAR
};
// Remove any transports that are not (currently) available
40
Guía de desarrollo Muestra de código: recuperar una página Web mediante el API de red
41
Guía de desarrollo Muestra de código: recuperar una página Web mediante el API de red
{
RichTextField _rtfOutput = new RichTextField();
public HTTPOutputScreen(Connection conn)
{
// Create a container for the data, and put it on the screen
_rtfOutput.setText("Retrieving data. Please wait...");
add(_rtfOutput);
// Retrieve the data from the web server, using the connection, on a
// separate thread
ContentReaderThread t = new ContentReaderThread(conn);
t.start();
}
// After the data has been retrieved, display it
public void showContents(final String result)
{
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
_rtfOutput.setText(result);
}
});
}
private final class ContentReaderThread extends Thread
{
private Connection _connection;
ContentReaderThread(Connection conn)
{
_connection = conn;
}
public void run()
{
String result = "";
OutputStream os = null;
InputStream is = null;
try
{
// Send HTTP GET to the server
OutputConnection outputConn = (OutputConnection) _connection;
os = outputConn.openOutputStream();
String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n";
os.write(getCommand.getBytes());
os.flush();
// Get InputConnection and read the server's response
InputConnection inputConn = (InputConnection) _connection;
is = inputConn.openInputStream();
byte[] data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
result = new String(data);
// is.close();
}
catch(Exception e)
{
result = "ERROR fetching content: " + e.toString();
}
finally
{
42
Guía de desarrollo Muestra de código: recuperar una página Web mediante el GCF
// Close OutputStream
if(os != null)
{
try
{
os.close();
}
catch(IOException e)
{
}
}
// Close InputStream
if(is != null)
{
try
{
is.close();
}
catch(IOException e)
{
}
}
// Close Connection
try
{
_connection.close();
}
catch(IOException ioe)
{
}
}
// Show the response received from the web server, or an error message
showContents(result);
}
}
}
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.ui.UiApplication;
import java.io.*;
import javax.microedition.io.*;
public class NetworkSample extends UiApplication
{
public static void main(String[] args)
43
Guía de desarrollo Muestra de código: recuperar una página Web mediante el GCF
{
NetworkSample app = new NetworkSample();
app.enterEventDispatcher();
}
public NetworkSample() {
new HTTPConnectionSetup();
}
}
class HTTPConnectionSetup
{
public HTTPConnectionSetup()
{
Thread t = new Thread(new Runnable()
{
public void run() {
Connection c = null;
try
{
c = Connector.open("http://www.blackberry.com;deviceside=false");
} catch (IOException e) {
e.printStackTrace();
}
if(c != null)
{
displayContent(c);
}
}
});
t.start();
}
private void displayContent(final Connection c) {
// When the connection thread completes, show the data from the web server
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run() {
UiApplication.getUiApplication().pushScreen(new HTTPOutputScreen(c));
}
});
}
}
class HTTPOutputScreen extends MainScreen
{
RichTextField _rtfOutput = new RichTextField();
public HTTPOutputScreen(Connection conn)
{
// Create a container for the data, and put it on the screen
_rtfOutput.setText("Retrieving data. Please wait...");
add(_rtfOutput);
// Retrieve the data from the web server, using the connection, on a
// separate thread
ContentReaderThread t = new ContentReaderThread(conn);
t.start();
}
// After the data has been retrieved, display it
public void showContents(final String result)
{
44
Guía de desarrollo Muestra de código: recuperar una página Web mediante el GCF
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
_rtfOutput.setText(result);
}
});
}
private final class ContentReaderThread extends Thread
{
private Connection _connection;
ContentReaderThread(Connection conn)
{
_connection = conn;
}
public void run()
{
String result = "";
OutputStream os = null;
InputStream is = null;
try
{
// Send HTTP GET to the server
OutputConnection outputConn = (OutputConnection) _connection;
os = outputConn.openOutputStream();
String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n";
os.write(getCommand.getBytes());
os.flush();
// Get InputConnection and read the server's response
InputConnection inputConn = (InputConnection) _connection;
is = inputConn.openInputStream();
byte[] data = net.rim.device.api.io.IOUtilities.streamToBytes(is);
result = new String(data);
// is.close();
}
catch(Exception e)
{
result = "ERROR fetching content: " + e.toString();
}
finally
{
// Close OutputStream
if(os != null)
{
try
{
os.close();
}
catch(IOException e)
{
}
}
// Close InputStream
if(is != null)
{
try
45
Guía de desarrollo Muestra de código: determinar los transportes de red con cobertura suficiente mediante la API de
red
{
is.close();
}
catch(IOException e)
{
}
}
// Close Connection
try
{
_connection.close();
}
catch(IOException ioe)
{
}
}
// Show the response received from the web server, or an error message
showContents(result);
}
}
}
46
Guía de desarrollo Muestra de código: control de radios
47
Guía de desarrollo Muestra de código: control de radios
48
Guía de desarrollo Muestra de código: control de radios
setTitleBar(tb);
}
public void fieldChanged(Field field, int context)
{
if (field instanceof ButtonField)
{
if(field == _btn3G)
{
if (_intRadioOn[0])
{
Radio.deactivateWAFs(RadioInfo.WAF_3GPP);
_btn3G.setLabel("3G Radio is off");
_intRadioOn[0] = false;
} else
{
Radio.activateWAFs(RadioInfo.WAF_3GPP);
_btn3G.setLabel("3G Radio is on");
_intRadioOn[0] = true;
}
} else if(field == _btnCDMA)
{
if (_intRadioOn[1])
{
Radio.deactivateWAFs(RadioInfo.WAF_CDMA);
_btnCDMA.setLabel("CDMA Radio is off");
_intRadioOn[1] = false;
} else
{
Radio.activateWAFs(RadioInfo.WAF_CDMA);
_btnCDMA.setLabel("CDMA Radio is on");
_intRadioOn[1] = true;
}
} else if(field == _btnWiFi)
{
if (_intRadioOn[2])
{
Radio.deactivateWAFs(RadioInfo.WAF_WLAN);
_btnWiFi.setLabel("WiFi Radio is off");
_intRadioOn[2] = false;
} else
{
Radio.activateWAFs(RadioInfo.WAF_WLAN);
_btnWiFi.setLabel("WiFi Radio is on");
_intRadioOn[2] = true;
}
}
}
}
}
49
Guía de desarrollo Muestra de código: determinar el estado de un transporte de red mediante la API de red
50
Guía de desarrollo Muestra de código: determinar el estado de un transporte de red mediante la API de red
((String)_ocfTransports.getChoice(intTransportType)
+ " is available.");
} else
{
_tfTransportStatus.setText
((String)_ocfTransports.getChoice(intTransportType)
+ " is available but has insufficient coverage.");
}
} else
{
_tfTransportStatus.setText("Sorry, " +
(String)_ocfTransports.getChoice(intTransportType)
+ " is not available.");
}
} else
{
_tfTransportStatus.setText
("Please select a transport first, then click 'Probe Transport'");
}
}
}
51
Guía de desarrollo Glosario
Glosario 7
3GPP
Third Generation Partnership Project (Proyecto de asociación de tercera generación)
AES
Advanced Encryption Standard (Estándar de cifrado avanzado)
API
Application Programming Interface (Interfaz de programación de aplicaciones)
APN
access point name (nombre de punto de acceso)
BlackBerry MDS
BlackBerry® Mobile Data System
CDMA
Code Division Multiple Access (Acceso múltiple por división de códigos)
EDGE
Enhanced Data Rates for Global Evolution (Velocidad de datos mejorada para una evolución global)
EVDO
Evolution Data Optimized (Datos de evolución optimizada)
GAN
red de acceso genérico
GERAN
Red de acceso radio para GSM-EDGE
GCF
Marco genérico de conexión (GCF)
GPRS
General Packet Radio Service
GSM
Global System for Mobile Communications® (Sistema global para comunicaciones móviles)
HTTP
Hypertext Transfer Protocol (Protocolo de transferencia de hipertexto)
52
Guía de desarrollo Glosario
HTTPS
Hypertext Transfer Protocol over Secure Sockets Layer (Protocolo de transferencia de hipertexto a través de un
nivel de socket seguro)
IP
Protocolo de Internet (Internet Protocol)
JSON
JavaScript Object Notation (Notación de Objetos de JavaScript)
RDF
Resource Description Framework (Marco de descripción de recursos)
RSS
Really Simple Syndication
SOAP
Protocolo de acceso simple a objetos
SSL
Secure Sockets Layer (Capa de sockets seguros)
TCP
Transmission Control Protocol (Protocolo de control de transmisión)
TLS
Transport Layer Security (Seguridad de capa de transporte)
Triple DES
Triple Data Encryption Standard (Estándar de cifrado triple de datos)
UDP
User Datagram Protocol (Protocolo del datagrama de usuario)
URI
Uniform Resource Identifier (Identificador uniforme de recursos)
URL
Uniform Resource Locator (Localizador uniforme de recursos)
UMTS
Universal Mobile Telecommunications System (Sistema Universal de Telecomunicaciones Móviles)
UTRAN
53
Guía de desarrollo Glosario
VPN
Virtual Private Network (Red privada virtual)
WAP
Wireless Application Protocol (Protocolo de aplicaciones inalámbricas)
WLAN
wireless local area network (red inalámbrica de área local)
WTLS
Wireless Transport Layer Security (Seguridad inalámbrica de la capa de transporte)
XML
Extensible Markup Language (Lenguaje de marcado extensible)
54
Guía de desarrollo Comentarios
Comentarios 8
Para ofrecer comentarios acerca de esta entrega, visite www.blackberry.com/docsfeedback.
55
Guía de desarrollo Historial de revisión del documento
56
Guía de desarrollo Aviso legal
Aviso legal 10
©2011 Research In Motion Limited. Reservados todos los derechos. BlackBerry®, RIM®, Research In Motion® y las
marcas comerciales, nombres y logotipos relacionados son propiedad de Research In Motion Limited y están
registrados y/o se usan en EE. UU. y en diferentes países del mundo.
3GPP yUMTS son marcas comerciales del European Telecommunications Standard Institute. Java y JavaScript son
marcas comerciales de Oracle America, Inc. CDMA2000 es una marca comercial de Telecommunications Industry
Association. Wi-Fi es una marca comercial de Wi-Fi Alliance.. Todas las demás marcas comerciales son propiedad de
sus respectivos propietarios.
Esta documentación, incluida cualquier documentación que se incorpore mediante referencia como documento
proporcionado o disponible en www.blackberry.com/go/docs se proporciona o se pone a disposición "TAL CUAL" y
"SEGÚN SU DISPONIBILIDAD" sin ninguna condición, responsabilidad o garantía de ningún tipo por Research In Motion
Limited y sus empresas afiliadas ("RIM") y RIM no asume ninguna responsabilidad por los errores tipográficos,
técnicos o cualquier otra imprecisión, error u omisión contenidos en esta documentación. Con el fin de proteger la
información confidencial y propia de RIM, así como los secretos comerciales, la presente documentación describe
algunos aspectos de la tecnología de RIM en líneas generales. RIM se reserva el derecho a modificar periódicamente
la información que contiene esta documentación, si bien tampoco se compromete en modo alguno a proporcionar
cambios, actualizaciones, ampliaciones o cualquier otro tipo de información que se pueda agregar a esta
documentación.
Esta documentación puede contener referencias a fuentes de información, hardware o software, productos o
servicios, incluidos componentes y contenido como, por ejemplo, el contenido protegido por copyright y/o sitios
Web de terceros (conjuntamente, los "Productos y servicios de terceros"). RIM no controla ni es responsable de
ningún tipo de Productos y servicios de terceros, incluido, sin restricciones, el contenido, la exactitud, el cumplimiento
de copyright, la compatibilidad, el rendimiento, la honradez, la legalidad, la decencia, los vínculos o cualquier otro
aspecto de los Productos y servicios de terceros. La inclusión de una referencia a los Productos y servicios de terceros
en esta documentación no implica que RIM se haga responsable de dichos Productos y servicios de terceros o de
dichos terceros en modo alguno.
EXCEPTO EN LA MEDIDA EN QUE LO PROHÍBA ESPECÍFICAMENTE LA LEY DE SU JURISDICCIÓN, QUEDAN EXCLUIDAS
POR LA PRESENTE TODAS LAS CONDICIONES, APROBACIONES O GARANTÍAS DE CUALQUIER TIPO, EXPLÍCITAS O
IMPLÍCITAS, INCLUIDA, SIN NINGÚN TIPO DE LIMITACIÓN, CUALQUIER CONDICIÓN, APROBACIÓN, GARANTÍA,
DECLARACIÓN DE GARANTÍA DE DURABILIDAD, IDONEIDAD PARA UN FIN O USO DETERMINADO, COMERCIABILIDAD,
CALIDAD COMERCIAL, ESTADO DE NO INFRACCIÓN, CALIDAD SATISFACTORIA O TITULARIDAD, O QUE SE DERIVE DE
UNA LEY O COSTUMBRE O UN CURSO DE LAS NEGOCIACIONES O USO DEL COMERCIO, O RELACIONADO CON LA
DOCUMENTACIÓN O SU USO O RENDIMIENTO O NO RENDIMIENTO DE CUALQUIER SOFTWARE, HARDWARE,
SERVICIO O CUALQUIER PRODUCTO O SERVICIO DE TERCEROS MENCIONADOS AQUÍ. TAMBIÉN PODRÍA TENER OTROS
DERECHOS QUE VARÍAN SEGÚN EL ESTADO O PROVINCIA. ES POSIBLE QUE ALGUNAS JURISDICCIONES NO PERMITAN
LA EXCLUSIÓN O LA LIMITACIÓN DE GARANTÍAS IMPLÍCITAS Y CONDICIONES. EN LA MEDIDA EN QUE LO PERMITA
LA LEY, CUALQUIER GARANTÍA IMPLÍCITA O CONDICIONES EN RELACIÓN CON LA DOCUMENTACIÓN NO SE PUEDEN
EXCLUIR TAL Y COMO SE HA EXPUESTO ANTERIORMENTE, PERO PUEDEN SER LIMITADAS, Y POR LA PRESENTE ESTÁN
LIMITADAS A NOVENTA (90) DÍAS DESDE DE LA FECHA QUE ADQUIRIÓ LA DOCUMENTACIÓN O EL ELEMENTO QUE
ES SUJETO DE LA RECLAMACIÓN.
57
Guía de desarrollo Aviso legal
EN LA MEDIDA MÁXIMA EN QUE LO PERMITA LA LEY DE SU JURISDICCIÓN, EN NINGÚN CASO RIM ASUMIRÁ
RESPONSABILIDAD ALGUNA POR CUALQUIER TIPO DE DAÑOS RELACIONADOS CON ESTA DOCUMENTACIÓN O SU
USO, O RENDIMIENTO O NO RENDIMIENTO DE CUALQUIER SOFTWARE, HARDWARE, SERVICIO O PRODUCTOS Y
SERVICIOS DE TERCEROS AQUÍ MENCIONADOS INCLUIDOS SIN NINGÚN TIPO DE LIMITACIÓN CUALQUIERA DE LOS
SIGUIENTES DAÑOS: DIRECTOS, RESULTANTES, EJEMPLARES, INCIDENTALES, INDIRECTOS, ESPECIALES, PUNITIVOS
O AGRAVADOS, DAÑOS POR PÉRDIDA DE BENEFICIOS O INGRESOS, IMPOSIBILIDAD DE CONSEGUIR LOS AHORROS
ESPERADOS, INTERRUPCIÓN DE LA ACTIVIDAD COMERCIAL, PÉRDIDA DE INFORMACIÓN COMERCIAL, PÉRDIDA DE
LA OPORTUNIDAD DE NEGOCIO O CORRUPCIÓN O PÉRDIDA DE DATOS, IMPOSIBILIDAD DE TRANSMITIR O RECIBIR
CUALQUIER DATO, PROBLEMAS ASOCIADOS CON CUALQUIER APLICACIÓN QUE SE UTILICE JUNTO CON PRODUCTOS
Y SERVICIOS DE RIM, COSTES DEBIDOS AL TIEMPO DE INACTIVIDAD, PÉRDIDA DE USO DE LOS PRODUCTOS Y SERVICIOS
DE RIM O PARTE DE ÉL O DE CUALQUIER SERVICIO DE USO, COSTE DE SERVICIOS SUSTITUTIVOS, COSTES DE
COBERTURA, INSTALACIONES O SERVICIOS, COSTE DEL CAPITAL O CUALQUIER OTRA PÉRDIDA MONETARIA SIMILAR,
TANTO SI DICHOS DAÑOS SE HAN PREVISTO O NO, Y AUNQUE SE HAYA AVISADO A RIM DE LA POSIBILIDAD DE DICHOS
DAÑOS.
EN LA MEDIDA MÁXIMA EN QUE LO PERMITA LA LEY DE SU JURISDICCIÓN, RIM NO TENDRÁ NINGÚN OTRO TIPO DE
OBLIGACIÓN O RESPONSABILIDAD CONTRACTUAL, EXTRACONTRACTUAL O CUALQUIER OTRA, INCLUIDA CUALQUIER
RESPONSABILIDAD POR NEGLIGENCIA O RESPONSABILIDAD ESTRICTA.
LAS LIMITACIONES, EXCLUSIONES Y DESCARGOS DE RESPONSABILIDAD SE APLICARÁN: (A) INDEPENDIENTEMENTE
DE LA NATURALEZA DE LA CAUSA DE LA ACCIÓN, DEMANDA O ACCIÓN SUYA, INCLUIDA PERO NO LIMITADA AL
INCUMPLIMIENTO DEL CONTRATO, NEGLIGENCIA, AGRAVIO, EXTRACONTRACTUAL, RESPONSABILIDAD ESTRICTA O
CUALQUIER OTRA TEORÍA DEL DERECHO Y DEBERÁN SOBREVIVIR A UNO O MÁS INCUMPLIMIENTOS ESENCIALES O
AL INCUMPLIMIENTO DEL PROPÓSITO ESENCIAL DE ESTE CONTRATO O CUALQUIER SOLUCIÓN CONTENIDA AQUÍ; Y
(B) A RIM Y A SUS EMPRESAS AFILIADAS, SUS SUCESORES, CESIONARIOS, AGENTES, PROVEEDORES (INCLUIDOS LOS
PROVEEDORES DE SERVICIOS DE USO), DISTRIBUIDORES AUTORIZADOS POR RIM (INCLUIDOS TAMBIÉN LOS
PROVEEDORES DE SERVICIOS DE USO) Y SUS RESPECTIVOS DIRECTORES, EMPLEADOS Y CONTRATISTAS
INDEPENDIENTES.
ADEMÁS DE LAS LIMITACIONES Y EXCLUSIONES MENCIONADAS ANTERIORMENTE, EN NINGÚN CASO NINGÚN
DIRECTOR, EMPLEADO, AGENTE, DISTRIBUIDOR, PROVEEDOR, CONTRATISTA INDEPENDIENTE DE RIM O CUALQUIER
AFILIADO DE RIM ASUMIRÁ NINGUNA RESPONSABILIDAD DERIVADA DE O RELACIONADA CON LA DOCUMENTACIÓN.
Antes de instalar, usar o suscribirse a cualquiera de los Productos y servicios de terceros, es su responsabilidad
asegurarse de que su proveedor de servicios de uso ofrezca compatibilidad con todas sus funciones. Puede que
algunos proveedores de servicios de uso no ofrezcan las funciones de exploración de Internet con una suscripción
al servicio BlackBerry® Internet Service. Consulte con su proveedor de servicios acerca de la disponibilidad, arreglos
de itinerancia, planes de servicio y funciones. La instalación o el uso de los Productos y servicios de terceros con
productos y servicios de RIM puede precisar la obtención de una o más patentes, marcas comerciales, derechos de
autor u otras licencias para evitar que se vulneren o violen derechos de terceros. Usted es el único responsable de
determinar si desea utilizar Productos y servicios de terceros y si se necesita para ello cualquier otra licencia de
terceros. En caso de necesitarlas, usted es el único responsable de su adquisición. No instale o utilice Productos y
servicios de terceros hasta que se hayan adquirido todas las licencias necesarias. Cualquier tipo de Productos y
servicios de terceros que se proporcione con los productos y servicios de RIM se le facilita para su comodidad "TAL
CUAL" sin ninguna condición expresa e implícita, aprobación, garantía de cualquier tipo por RIM y RIM no sume
58
Guía de desarrollo Aviso legal
ninguna responsabilidad en relación con ello. El uso de los Productos y servicios de terceros se regirá y estará sujeto
a la aceptación de los términos de licencias independientes aplicables en este caso con terceros, excepto en los casos
cubiertos expresamente por una licencia u otro acuerdo con RIM.
Algunas funciones mencionadas en esta documentación requieren una versión mínima del software de BlackBerry®
Enterprise Server, BlackBerry® Desktop Software y/o BlackBerry® Device Software.
Los términos de uso de cualquier producto o servicio de RIM se presentan en una licencia independiente o en otro
acuerdo con RIM que se aplica en este caso. NINGUNA PARTE DE LA PRESENTE DOCUMENTACIÓN ESTÁ PENSADA
PARA PREVALECER SOBRE CUALQUIER ACUERDO EXPRESO POR ESCRITO O GARANTÍA PROPORCIONADA POR RIM
PARA PARTES DE CUALQUIER PRODUCTO O SERVICIO DE RIM QUE NO SEA ESTA DOCUMENTACIÓN.
Publicado en Canadá
59