0

我想为我的android应用程序使用EWS-Java-API。 应用程序需要登录才能以编程方式访问Microsoft Exchange Server(例如日历会议,电子邮件,会议室等)。EWS-Java-API - EmailMessage.send进入java.lang.NullPointerException:format == null

此时几乎整个问题都被编辑了,以防万一以显示目前的情况。

我试图让连接到Exchange版本15.0.11与URL( “HTTPS://yourserver/EWS/Exchange.asmx”)

的gradle构建文件:

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.1" 
useLibrary 'org.apache.http.legacy' 

defaultConfig {   
    minSdkVersion 18 
    targetSdkVersion 22 
    versionCode 1 
    versionName "1.0" 
    multiDexEnabled true 
} 

packagingOptions {   
    exclude 'META-INF/DEPENDENCIES.txt' 
    exclude 'META-INF/DEPENDENCIES' 
    exclude 'META-INF/dependencies.txt' 
    exclude 'META-INF/LICENSE.txt' 
    exclude 'META-INF/LICENSE' 
    exclude 'META-INF/license.txt' 
    exclude 'META-INF/LGPL2.1' 
    exclude 'META-INF/NOTICE.txt' 
    exclude 'META-INF/NOTICE' 
    exclude 'META-INF/notice.txt' 
} [...] } 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.2.1' 
    compile 'com.android.support:design:23.3.0' 
    compile 'com.google.android.gms:play-services:6.5.87' 
    compile 'org.altbeacon:android-beacon-library:2.7.1' 
    compile 'org.greenrobot:eventbus:3.0.0' 
    compile files('libs/jcifs-1.3.15.jar') 
    compile files('libs/commons-logging-1.1.1.jar') 
    compile files('libs/commons-codec-1.4.jar') 
    compile files('libs/commons-httpclient-3.1.jar') 
    compile 'com.microsoft.ews-java-api:ews-java-api:2.0' } 

这会导致这个错误信息

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/client/protocol/HttpClientContext; 

线:

ExchangeService service = new ExchangeService();  

此时我测试了这个ews库“github.com/faisons/EWS-For-Android”。

​​3210

这几乎工作。 Iam能够启动应用程序并设置ExchangeService。现在

Thread thread = new Thread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      try 
      { 
       ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); 
       ExchangeCredentials credentials = new WebCredentials(myuser, mypw); 
       service.setCredentials(credentials); 
       service.setUrl(new URI("https://exchmail.yourserver.com/EWS/Exchange.asmx")); 
       EmailMessage message = new EmailMessage(service); 
       EmailAddress from = new EmailAddress(myemail); 
       message.setSender(from);     
       message.getToRecipients().add(anotherEmail); 
       message.setSubject("Much wow - such message"); 
       MessageBody messageBody = new MessageBody(); 
       messageBody.setText("text here"); 
       message.setBody(messageBody); 
       message.send(); 

      } 
      catch (Exception e) 
      { 
       Log.e(TAG, "message", e); 
      } 
     } 
    }); 

    thread.start(); 

的错误是:

java.lang.NullPointerException: format == null 
    at java.lang.String.format(String.java:1799) 
at java.lang.String.format(String.java:1777) 
    at java.lang.String.format(String.java:1799) 
    at microsoft.exchange.webservices.data.ServiceRequestBase.getEwsHttpWebResponse(ServiceRequestBase.java:936) 
at microsoft.exchange.webservices.data.ServiceRequestBase.validateAndEmitRequest(ServiceRequestBase.java:821) 
at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:46) 
at microsoft.exchange.webservices.data.MultiResponseServiceRequest.execute(MultiResponseServiceRequest.java:143) 
at microsoft.exchange.webservices.data.ExchangeService.internalCreateItems(ExchangeService.java:463) 
at microsoft.exchange.webservices.data.ExchangeService.createItem(ExchangeService.java:534) 
at microsoft.exchange.webservices.data.Item.internalCreate(Item.java:215) 
at microsoft.exchange.webservices.data.EmailMessage.internalSend(EmailMessage.java:125) 

荫困惑如何获得API的使用。如果有人知道另一种方式获得访问任何提示是值得欢迎的!

回答

2

问候!我有好消息,它有效!荫不知道这是一个完美的方式,但我能够发送电子邮件

首先确保你在manifes文件中声明的权限:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

这是我的构建。 gradle这个文件:

android { 
compileSdkVersion 23 
buildToolsVersion "23.0.1" 
useLibrary 'org.apache.http.legacy'  // <--------------------- 

defaultConfig { 
    applicationId "your application id" 
    minSdkVersion 18 
    targetSdkVersion 22 
    versionCode 1 
    versionName "1.0" 
    multiDexEnabled true 
} 

packagingOptions { 
    exclude 'META-INF/LICENSE.txt' 
    exclude 'META-INF/NOTICE.txt' 
    exclude 'META-INF/DEPENDENCIES.txt' 
    exclude 'META-INF/DEPENDENCIES' 
    exclude 'META-INF/dependencies.txt' 
    exclude 'META-INF/LICENSE.txt' 
    exclude 'META-INF/LICENSE' 
    exclude 'META-INF/license.txt' 
    exclude 'META-INF/LGPL2.1' 
    exclude 'META-INF/NOTICE.txt' 
    exclude 'META-INF/NOTICE' 
    exclude 'META-INF/notice.txt' 
} 

buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
}} 

dependencies { 
compile fileTree(include: ['*.jar'], dir: 'libs') 
testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:23.2.1' 
compile 'com.android.support:design:23.3.0 
compile files('libs/ews-android-api.jar') // <--------------------- 
compile 'joda-time:joda-time:2.8'}   // <--------------------- 

您可以将此链接下得到EWS-Android的API: https://github.com/alipov/ews-android-api

只要按照建筑instructi ons来创建jar文件。

这是发送电子邮件的基本命令行(运行此作为异步任务或在一个新的线程):

   ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); 
       ExchangeCredentials credentials = new WebCredentials("user", "pw"); 
       service.setCredentials(credentials); 
       service.setUrl(new URI("https:// s e r v e r /ews/exchange.asmx"));      
       EmailAddress mEmail = new EmailAddress("your email/test email"); 

       EmailMessage message = new EmailMessage(service); 
       message.getToRecipients().add(mEmail); 
       message.setFrom(mEmail); 
       message.setSubject("Hello world!"); 
       message.setBody(MessageBody.getMessageBodyFromText("Sent using the EWS Android API.")); 
       message.send(); 

您可以用EWSEditor检查您的凭证。 大声喊出DevilGeek和Alipov。

如果有什么不清楚的地方请随时询问。

亲切的问候!编辑: 它似乎与几乎所有的工作。特别是您不需要Office 365。例如,iam能够调用“service.getRoomLists();”以及。

+0

我得到了”java .lang.NoClassDefFoundError:无法解析:Ljava/applet/Applet“,当我调用AutodiscoverService.getUserSettings时,已经在https://github.com/alipov/ews-android-api/issues/3上有记录。你是如何解决这个问题的? – NotAgain

0

您是否将apache遗留行添加到您的gradle构建中?

android { 
    compileSdkVersion 22 
    buildToolsVersion "22.0.1" 
    useLibrary 'org.apache.http.legacy' 
    ... 
} 

更多信息请参阅本:http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

+0

感谢您的快速答案Benoit! 我添加了这个,并得到了警告: 警告:无法找到可选库:org.apache.http.legacy – Lugo

+0

当我尝试运行该应用程序时,我得到: 警告:依赖项commons-logging:commons-logging:调试时忽略1.2,因为它可能与Android提供的内部版本冲突。如果出现问题,请用jarjar重新打包以更改类包 错误:配置项目':app'时发生问题。 >无法找到可选库:org.apache.http.legacy – Lugo

+0

我认为你应该删除你的依赖'编译文件('libs/org.apache.http.legacy.jar')'因为遗留将被导入SDK。 至于你的错误,你应该看看那篇文章:http://stackoverflow.com/questions/33898857/why-warningunable-to-find-optional-library-org-apache-http-legacy-occurs它似乎您的SDK安装不包含可选项。重新安装它可能会解决问题。 – Benoit