2

SSL化されたphp Webサービスに接続できるAndroid 3.0プログラムに取り組んでいます(JSONでデータを出力し、サーバーを変更できます)。このサービスに接続しているタブレットには、企業の Microsoft ActiveSync (exchange 2010) アカウントがあり、そのアカウントのみがあります (Google アカウント、FB などはありません)。タブレットのandroid.accounts.AccountManagerに保存された資格情報を使用して、その PHP Web サービスで安全な要求を行うプログラムを作成したいと思います。私はいくつかのグーグルの例に従ってみましたが、問題は次の行を使用するときにあると思います: AccountManagerFuture<Bundle> data = am.getAuthToken(b, "JWT", options, this, ota, null); アプリケーションがハングするだけで、結果が得られません。実際、OnTokenAcquired クラスの任意の行にブレークポイントを設定しても、何も起こりません。AKA OnTokenRequired は決して実行されません

アドバイスや指示はありますか?これは、企業のAndroidクライアントソフトウェアを入手するのに役立つと確信しています

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();
              }            
       }
}
4

2 に答える 2

0

Exchange アカウントの適切なトークン タイプを渡す必要があります。私はそれが何の手に負えないのかわかりませんが、それが「テスト」であるとは思えません。最初に適切なトークンの種類を調べます (サポートされている場合)。それ以外の場合、コードは問題ないように見えます。ただし、トークンを使用して Exchange に対して認証する方法は別の問題です。

于 2012-05-30T02:31:08.220 に答える
0

ソースを数時間調査した後、次のコードを見つけました。

public Bundle  getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle loginOptions) throws NetworkErrorException {
     return null;
}

これは、android exchange Authenticator が Exchange-Server のトークンベース認証を提供しないことを意味します...

于 2012-06-27T07:36:47.633 に答える