J'essaie de consommer un service SOAP dans mon Android. J'essaie de suivre ce guide . Lorsque je essayez d'exécuter mon application, j'obtiens une erreur:
Error: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
Je suis sur Android N (SDK 25 - je ne peux pas passer à 26 comme l'indique le message d'erreur) et c'est un tout nouveau projet créé par Android = Studio.
Voici mon fichier build.gradle de projet que je n'ai pas modifié:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:3.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Et voici mon fichier build.gradle d'application:
apply plugin: 'com.Android.application'
configurations {
jaxb
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE")
}
}
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenCentral()
}
// tag::wsdl[]
task genJaxb {
ext.sourcesDir = "${buildDir}/generatedjava/jaxb"
ext.classesDir = "${buildDir}/classes/jaxb"
ext.schema = "https://lite.realtime.nationalrail.co.uk/OpenLDBWS/wsdl.aspx?ver=2017-10-01"
outputs.dir classesDir
doLast() {
project.ant {
taskdef name: "xjc", classname: "com.Sun.tools.xjc.XJCTask",
classpath: configurations.jaxb.asPath
mkdir(dir: sourcesDir)
mkdir(dir: classesDir)
xjc(destdir: sourcesDir, schema: schema,
package: "hello.wsdl") {
arg(value: "-wsdl")
produces(dir: sourcesDir, includes: "**/*.Java")
}
javac(destdir: classesDir, source: 1.8, target: 1.8, debug: true,
debugLevel: "lines,vars,source",
classpath: configurations.jaxb.asPath) {
src(path: sourcesDir)
include(name: "**/*.Java")
include(name: "*.Java")
}
copy(todir: classesDir) {
fileset(dir: sourcesDir, erroronmissingdir: false) {
exclude(name: "**/*.Java")
}
}
}
}
}
// end::wsdl[]
Android {
compileSdkVersion 29
buildToolsVersion "29.0.0"
defaultConfig {
applicationId "com.example.magicmirror"
minSdkVersion 25
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
packagingOptions {
exclude 'META-INF/spring.tooling'
exclude 'META-INF/spring.handlers'
exclude 'META-INF/spring-configuration-metadata.json'
exclude 'META-INF/additional-spring-configuration-metadata.json'
exclude 'META-INF/spring.factories'
exclude 'META-INF/spring.schemas'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/notice.txt'
exclude 'META-INF/ASL2.0'
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation "org.springframework.boot:spring-boot-starter"
implementation "org.springframework.ws:spring-ws-core"
implementation(files(genJaxb.classesDir).builtBy(genJaxb))
jaxb "com.Sun.xml.bind:jaxb-xjc:2.1.7"
}
D'après les journaux, le JAR exact à l'origine de ceci est org.springframework/spring-core/5.1.8.RELEASE.jar
. L'ajout du bloc compileOptions
est mentionné dans d'autres réponses comme un correctif mais il n'a pas résolu ce problème. Comment puis-je réparer cela?
Avez-vous essayé ksoap?
https://github.com/simpligility/ksoap2-Android
On dirait qu'il devrait faire du savon, est vivant et fonctionne pour Android.
Le projet ksoap2-Android fournit une bibliothèque cliente légère et efficace SOAP pour la plate-forme Android.
Je pense que vous avez juste besoin d'utiliser une bibliothèque différente pour effectuer vos appels SOAP. C'est ce que j'ai utilisé qui prend en charge les versions du SDK dès 14.
private void GetSomeStuff(String myterm) throws UnsupportedEncodingException {
try {
String strStuff2 = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
"<soap:Header><wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\">"+
"<wsse:UsernameToken><wsse:Username>my username</wsse:Username><wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">my password</wsse:Password></wsse:UsernameToken></wsse:Security></soap:Header>"+
"<soap:Body> <GetSomeStuff xmlns=\"https://mycompany.com.MyService\">"+
"<term>" + myterm + "/term></GetSomeStuff></soap:Body></soap:Envelope>";
StringBuilder stringBuilder = new StringBuilder();
HttpPost httppost = new HttpPost("https://mycompany.com/MyService.svc");
StringEntity se;
se = new StringEntity(strStuff2,HTTP.UTF_8);
httppost.setHeader("SOAPAction", "https://mycompany.com.MyService/GetSomeStuff”);
se.setContentType("text/xml");
httppost.setEntity(se);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse theresponse = (HttpResponse) httpclient.execute(httppost);
StatusLine statusLine = theresponse.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = theresponse.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
String theXML = stringBuilder.toString();
int start = theXML.indexOf("<GetSomeStuffResult>") + 21;
int end = theXML.indexOf("</GetSomeStuffResult>") - 1;
// We didn't get the response we expected
if ((start < 0) || (end < 0) || (start==end)) {
Log.i(“MyApp”,”Empty Response from GetSomeStuffResult");
return;
}
String myData = theXML.substring(start, end);
if (myData() > 0) {
try {
JSONObject jObject = new JSONObject(myData);
String deptDesc = jObject.getString("DepartmentDescription");
String areaCode = jObject.getString("area_code");
String phoneNumber = jObject.getString("phone_nbr");
String title = jObject.getString("title");
String fullPhoneNumber = "";
if (phoneNumber.length() == 7) {
fullPhoneNumber = "(" + areaCode + ") " + phoneNumber.substring(0, 3) + "-" + phoneNumber.substring(3, 7);
} else {
fullPhoneNumber = "(" + areaCode + ") " + phoneNumber;
}
SharedPreferences appPrefs =
getSharedPreferences("appPreferences",MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = appPrefs.edit();
prefsEditor.putString("Title",title);
prefsEditor.putString("DeptDescr",deptDesc);
prefsEditor.putString("PhoneNumber",fullPhoneNumber);
prefsEditor.commit();
}
catch (JSONException e) {
e.printStackTrace();
}
}
} else {
Log.e(“MyApp”, "Failed to GetSomeStuff”);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
org.springframework/spring-core/5.1.8.RELEASE.jar
ne fonctionnera pas avec minSdkVersion 25
et ce n'est même pas et Android, mais une bibliothèque Java. Elle exige strictement minSdkVersion 26
:
MethodHandle.invoke and MethodHandle.invokeExact
are only supported starting with Android O (--min-api 26)
ksoap2-Android pourrait en effet être plus compatible (le plus courant) ou
wsdl2ksoap2-Android avec "code source automatique généré à partir de WSDL" sur l'appareil.
... il y en a quelques autres liés; certains nécessitent la génération de POJO sur Desktop Java.