Эта ошибка связана с тем, что APK-генерируемой не включают в себя (удалить) информацию ServiceLoader (в META-INF/услуг). Вы можете протестировать себя, удалив его из созданной банки, и увидите, что появляется та же ошибка. В документации говорится, что теперь она поддерживается, но я нашел проблемы с ее использованием.
http://developer.android.com/reference/java/util/ServiceLoader.html
можно включить вручную данные в APK с помощью муравей
Keep 'META-INF/services'-files in apk
После отладки 10h, удаления классов вручную, в том числе META-INF/услуги и т.д., я обнаружил, что Azure SDK использует некоторые классы, не поддерживаемые Android (javax.ws. *), И любая работа для меня работает.
Поэтому я бы рекомендовал использовать REST API в средах Android, найти ниже исходного кода, который я использовал для передачи сообщений в эту тему.
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());
}
Дополнительная информация в REST API Информация о Azure.
Ermm ... вы можете замаскировать свой ключ приложения в своем примере кода выше! –
У вас пробовал тот же пример кода на машине Linux/Mac/Windows? Вы уверены, что это проблема совместимости с Android? –
Ключ приложения скрыт ;-) – stef