Connecting Azure Service Bus with Android

后端 未结 1 1654
暖寄归人
暖寄归人 2021-01-01 03:00

I wrote a simply java program (jdk 1.7) that lists all my service bus topics and prints out the name of each topic to stdout:

         try {

         String         


        
相关标签:
1条回答
  • 2021-01-01 03:22

    This error is due to the fact that apks generated do not include (remove) the ServiceLoader information (under META-INF/services). You can test yourself deleting it from the jar generated and see that the same error appears. In the documentation it is said that it is now supported, but i found problems to use it.

    http://developer.android.com/reference/java/util/ServiceLoader.html

    You can include manually the data in the apk using ant

    Keep 'META-INF/services'-files in apk

    After 10h debugging, removing classes manually, including META-INF/services, etc, I found that the Azure SDK uses some classes not supported by Android (javax.ws.*) and any woraround works for me.

    So I would recommend using the REST API in Android environments, find below the source code i used to sebd messages to the topic.

    private static String generateSasToken(URI uri) {
        String targetUri;
        try {
            targetUri = URLEncoder
            .encode(uri.toString().toLowerCase(), "UTF-8")
            .toLowerCase();
    
            long expiresOnDate = System.currentTimeMillis();
            int expiresInMins = 20; // 1 hour
            expiresOnDate += expiresInMins * 60 * 1000;
            long expires = expiresOnDate / 1000;
            String toSign = targetUri + "\n" + expires;
    
            // Get an hmac_sha1 key from the raw key bytes
            byte[] keyBytes = sasKey.getBytes("UTF-8");
            SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA256");
    
            // Get an hmac_sha1 Mac instance and initialize with the signing key
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(signingKey);
            // Compute the hmac on input data bytes
            byte[] rawHmac = mac.doFinal(toSign.getBytes("UTF-8"));
    
            // using Apache commons codec for base64
    //      String signature = URLEncoder.encode(
    //      Base64.encodeBase64String(rawHmac), "UTF-8");
            String rawHmacStr = new String(Base64.encodeBase64(rawHmac, false),"UTF-8");
            String signature = URLEncoder.encode(rawHmacStr, "UTF-8");
    
            // construct authorization string
            String token = "SharedAccessSignature sr=" + targetUri + "&sig="
            + signature + "&se=" + expires + "&skn=" + sasKeyName;
            return token;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
    public static void Send(String topic, String subscription, String msgToSend) throws Exception {
    
            String url = uri+topic+"/messages";
    
            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(url);
    
            // Add header
            String token = generateSasToken(new URI(uri));
            post.setHeader("Authorization", token);
            post.setHeader("Content-Type", "text/plain");
            post.setHeader(subscription, subscription);
            StringEntity input = new StringEntity(msgToSend);
            post.setEntity(input);
    
            System.out.println("Llamando al post");
            HttpResponse response = client.execute(post);
            System.out.println("Response Code : " 
                    + response.getStatusLine().getStatusCode());
            if (response.getStatusLine().getStatusCode() != 201)
                throw new Exception(response.getStatusLine().getReasonPhrase());
    
    }
    

    Further info at REST API Azure information.

    0 讨论(0)
提交回复
热议问题