我正在开发一个可以连接到SSL'd php网络服务的Android 3.0程序(以JSON输出数据,我可以修改服务器)。连接到此服务的平板电脑具有公司Microsoft ActiveSync(Exchange 2010)帐户,并且只有该帐户(没有Google帐户,FB等)。我想编写一个程序,该程序可以使用平板电脑的android.accounts.AccountManager中保存的凭据在该PHP网络服务上发出安全请求。我尝试遵循一些谷歌示例,但我认为问题在于我使用该行时: AccountManagerFuture<Bundle> data = am.getAuthToken(b, "JWT", options, this, ota, null);
应用程序只是挂起,我没有得到任何结果。事实上,在 OnTokenAcquired 类中的任何行设置断点都不会执行任何操作。AKA OnTokenRequired 永远不会被执行
有什么建议或方向吗?我相信这对获取企业安卓客户端软件很有帮助
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerFuture;
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
public class AcctestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
AccountManager am = AccountManager.get(this);
EditText et = (EditText) findViewById(R.id.editText1);
OnTokenAcquired ota = new OnTokenAcquired(et);
Account exchange = null;
Bundle options = new Bundle();
for(Account a : am.getAccounts()){
if(a.type.equals("com.android.exchange") && a.name.endsWith("@domain.com"))
exchange = a;
}
AccountManagerFuture<Bundle> data = am.getAuthToken(exchange, "JWT", options, this, ota, null);
}
}
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.Toast;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class OnTokenAcquired implements AccountManagerCallback<Bundle> {
private EditText et;
public OnTokenAcquired(EditText et){
this.et = et;
}
public void run(AccountManagerFuture<Bundle> result) {
Bundle bundle;
try {
Toast.makeText(null, "Start!", Toast.LENGTH_LONG).show();
bundle = result.getResult(1, TimeUnit.SECONDS);
String token = bundle.getString(AccountManager.KEY_AUTHTOKEN); et.append("nToken: " + token);
Toast.makeText(null, token, Toast.LENGTH_LONG).show();
} catch (OperationCanceledException e) {
e.printStackTrace();
} catch (AuthenticatorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
经过几个小时的源代码研究,我发现了这段代码:
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle loginOptions) throws NetworkErrorException {
return null;
}
这意味着,android exchange身份验证器不为Exchange-Server提供基于令牌的身份验证...
您必须为 Exchange 帐户传递正确的令牌类型。我不知道它是什么,但我怀疑它会是"测试"。首先研究正确的令牌类型(如果支持)。否则,您的代码看起来正常。不过,如何使用令牌向 Exchange 进行身份验证是另一回事。