Java 与Microsoft Translator API连接时的SSLException

Java 与Microsoft Translator API连接时的SSLException,java,android,microsoft-translator,Java,Android,Microsoft Translator,我一直在尝试将我的Android应用程序与Microsoft Translator API连接,并且我已经在Microsoft Azure Marketplace中注册了我的应用程序。但是当我运行我的应用程序时,我在打开我的应用程序时经常遇到IOException 04-17 21:18:15.661: E/TranslateTask(274): IOException 04-17 21:18:15.661: E/TranslateTask(274): javax.net.ssl.SSLExce

我一直在尝试将我的Android应用程序与Microsoft Translator API连接,并且我已经在Microsoft Azure Marketplace中注册了我的应用程序。但是当我运行我的应用程序时,我在打开我的应用程序时经常遇到IOException

04-17 21:18:15.661: E/TranslateTask(274): IOException
04-17 21:18:15.661: E/TranslateTask(274): javax.net.ssl.SSLException: Not trusted server certificate
04-17 21:18:15.661: E/TranslateTask(274):   at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371)
04-17 21:18:15.661: E/TranslateTask(274):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.getSecureSocket(HttpConnection.java:168)
04-17 21:18:15.661: E/TranslateTask(274):   at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:399)
04-17 21:18:15.661: E/TranslateTask(274):   at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:147)
04-17 21:18:15.661: E/TranslateTask(274):   at ac.lk.iit.androidtranslatorproject.TranslateActivity$GetAccessTokenTask.doInBackground(TranslateActivity.java:212)
04-17 21:18:15.661: E/TranslateTask(274):   at ac.lk.iit.androidtranslatorproject.TranslateActivity$GetAccessTokenTask.doInBackground(TranslateActivity.java:1)
04-17 21:18:15.661: E/TranslateTask(274):   at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-17 21:18:15.661: E/TranslateTask(274):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-17 21:18:15.661: E/TranslateTask(274):   at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-17 21:18:15.661: E/TranslateTask(274):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-17 21:18:15.661: E/TranslateTask(274):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
04-17 21:18:15.661: E/TranslateTask(274):   at java.lang.Thread.run(Thread.java:1096)
04-17 21:18:15.661: E/TranslateTask(274): Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
04-17 21:18:15.661: E/TranslateTask(274):   at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:168)
04-17 21:18:15.661: E/TranslateTask(274):   at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:366)
04-17 21:18:15.661: E/TranslateTask(274):   ... 11 more
04-17 21:18:15.661: E/TranslateTask(274): Caused by: java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
04-17 21:18:15.661: E/TranslateTask(274):   at org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi.engineValidate(PKIXCertPathValidatorSpi.java:149)
04-17 21:18:15.661: E/TranslateTask(274):   at java.security.cert.CertPathValidator.validate(CertPathValidator.java:202)
04-17 21:18:15.661: E/TranslateTask(274):   at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:164)
04-17 21:18:15.661: E/TranslateTask(274):   ... 12 more
此外,以下是与应用程序相关的文件

TranslateActivity.java

package ac.lk.iit.androidtranslatorproject;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

public class TranslateActivity extends Activity {
    private static final String TAG = "TranslateTask";
    private Spinner fromSpinner;
    private Spinner toSpinner;
    private EditText origText;
    private TextView transText;
    private Button transButton;
    private String fromLang;
    private String toLang;
    private TextWatcher textWatcher;
    private OnItemSelectedListener itemListener;
    private OnClickListener buttonListener;
    // needed to make translate requests to Microsoft
    private String accessToken;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_translate);
        findViews();
        setAdapters();
        setListeners();
        // get the access token from Microsoft
        new GetAccessTokenTask().execute();
    }

    private void findViews() {
        fromSpinner = (Spinner) findViewById(R.id.from_language);
        toSpinner = (Spinner) findViewById(R.id.to_language);
        origText = (EditText) findViewById(R.id.original_text);
        transText = (TextView) findViewById(R.id.translated_text);
        transButton = (Button) findViewById(R.id.translate_button);
    }

    /** Define data source for the spinners */
    private void setAdapters() {
        // Spinner list comes from a resource,
        // Spinner user interface uses standard layouts
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.languages,android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        fromSpinner.setAdapter(adapter);
        toSpinner.setAdapter(adapter);
        // Automatically select two spinner items
        fromSpinner.setSelection(8); // English (en)
        toSpinner.setSelection(25); // Spanish (es)
    }

    private void setListeners() {
        textWatcher = new TextWatcher() {
            public void beforeTextChanged(CharSequence s,int start, int count,int after) {
            }

            public void onTextChanged(CharSequence s,int start, int before,int count) {
                /*doTranslate2(origText.getText().toString().trim(),fromLang, toLang); */
            }

            public void afterTextChanged(Editable s) {
            }};
            origText.addTextChangedListener(textWatcher);
            itemListener = new OnItemSelectedListener() {
                public void onItemSelected(AdapterView parent, View v,int position, long id) {
                fromLang = getLang(fromSpinner);
                toLang = getLang(toSpinner);
                if (accessToken != null)
                    doTranslate2(origText.getText().toString().trim(), fromLang, toLang);
                }
                public void onNothingSelected(AdapterView parent) {
                    /* Do nothing */
                }};
                fromSpinner.setOnItemSelectedListener(itemListener);
                toSpinner.setOnItemSelectedListener(itemListener);
                buttonListener = new OnClickListener() {
                    public void onClick(View v) {
                    if (accessToken != null)
                        System.out.println(accessToken);
                        doTranslate2(origText.getText().toString().trim(), fromLang, toLang);
                    }};
                    transButton.setOnClickListener(buttonListener);
                }

                /** Extract the language code from the current spinner item */
            private String getLang(Spinner spinner) {
                String result = spinner.getSelectedItem().toString();
                int lparen = result.indexOf('(');
                int rparen = result.indexOf(')');
                result = result.substring(lparen + 1, rparen);
                return result;
            }

            private void doTranslate2(String original,String from, String to) {
                if (accessToken != null)
                    new TranslationTask().execute(original, from, to);
            }

            private class TranslationTask extends AsyncTask<String,Void,String> {
                protected void onPostExecute(String translation) {
                    transText.setText(translation);
                }
                protected String doInBackground(String... s) {
                    HttpURLConnection con2 = null;
                    String result = getResources().getString(
                    R.string.translation_error);
                    String original = s[0];
                    String from = s[1];
                    String to = s[2];
                    try {
                        // Read results from the query
                        BufferedReader reader;
                        String uri = "http://api.microsofttranslator.com" + "/v2/Http.svc/Translate?text=" + URLEncoder.encode(original) +"&from=" + from + "&to=" + to;
                        URL url_translate = new URL(uri);
                        String authToken = "Bearer" + " " + accessToken;
                        con2 = (HttpURLConnection) url_translate.
                        openConnection();
                        con2.setRequestProperty("Authorization", authToken);
                        con2.setDoInput(true);
                        con2.setReadTimeout(10000 /* milliseconds */);
                        con2.setConnectTimeout(15000 /* milliseconds */);
                        reader = new BufferedReader(new InputStreamReader(
                        con2.getInputStream(), "UTF-8"));
                        String translated_xml = reader.readLine();
                        reader.close();
                        /* translated_xml now contains the following XML:
                        <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Hola</string> */
                        // parse the XML returned
                        DocumentBuilder builder = DocumentBuilderFactory.
                        newInstance().newDocumentBuilder();
                        Document doc = builder.parse(new InputSource(new StringReader(translated_xml)));
                        NodeList node_list = doc.getElementsByTagName("string");
                        NodeList l = node_list.item(0).getChildNodes();
                        Node node;
                        String translated = null;
                        if (l != null && l.getLength() > 0) {
                            node = l.item(0);
                            translated = node.getNodeValue();
                        }
                        if (translated != null)
                            result = translated;
                        } catch (IOException e) {
                            Log.e(TAG, "IOException", e);
                        } catch (SAXException e) {
                            e.printStackTrace();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        finally {
                            if (con2 != null) {
                                con2.disconnect();
                            }
                        }
                        return result;
                    }
                }

            private class GetAccessTokenTask extends AsyncTask<Void, Void, String> {
                protected void onPostExecute(String access_token) {
                    accessToken = access_token;
                }
                protected String doInBackground(Void... v) {
                    String result = null;
                    HttpURLConnection con = null;
                    String clientID = "<client id>";
                    String clientSecret = "<client secret>";
                    String strTranslatorAccessURI ="https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
                    String strRequestDetails = "grant_type=" + "client_credentials&client_id=" + URLEncoder.encode(clientID) + "&client_secret="+ URLEncoder.encode(clientSecret) + "&scope=http://api.microsofttranslator.com";

                    try {
                        URL url = new URL(strTranslatorAccessURI);
                        con = (HttpURLConnection) url.openConnection();
                        con.setReadTimeout(10000 /* milliseconds */);
                        con.setConnectTimeout(15000 /* milliseconds */);
                        con.setRequestMethod("POST");
                        con.setDoInput(true);
                        con.setDoOutput(true);
                        con.setChunkedStreamingMode(0);
                        // Start the query
                        con.connect();
                        OutputStream out = new BufferedOutputStream(con.getOutputStream());
                        out.write(strRequestDetails.getBytes());
                        out.flush();
                        // Read results from the query
                        BufferedReader reader = new BufferedReader(
                        new InputStreamReader(con.getInputStream(), "UTF-8"));
                        String payload = reader.readLine();
                        reader.close();
                        out.close();
                        /* payload now contains JSON attribute value pairs:
                        {"token_type":"http://schemas.xmlsoap.org/ws/2009/
                        11/swt-token-profile-1.0","access_token":"....",
                        "expires_in":"600","scope":
                        "http://api.microsofttranslator.com"} */
                        // Parse to get the access token
                        JSONObject jsonObject = new JSONObject(payload);
                        result = jsonObject.getString("access_token");
                    } catch (IOException e) {
                        Log.e(TAG, "IOException", e);
                    } catch (JSONException e) {
                        Log.e(TAG, "JSONException", e);
                    } finally {
                        if (con != null) {
                            con.disconnect();
                        }
                    }
                    return result;
                }
            }
}
包ac.lk.iit.AndroidTranslator项目;
导入java.io.BufferedOutputStream;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.io.StringReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.net.urlcoder;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.json.JSONException;
导入org.json.JSONObject;
导入org.w3c.dom.Document;
导入org.w3c.dom.Node;
导入org.w3c.dom.NodeList;
导入org.xml.sax.InputSource;
导入org.xml.sax.SAXException;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.util.Log;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemSelectedListener;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.Spinner;
导入android.widget.TextView;
公共类TranslateActivity扩展了活动{
私有静态最终字符串TAG=“TranslateTask”;
来自Spinner的私有Spinner;
私人纺纱机;
私人编辑文本编辑文本;
私有文本视图transText;
专用按钮转换按钮;
私有字符串fromLang;
私人字符串托朗;
私人文本观察者文本观察者;
private OnItemSelectedListener itemListener;
私有OnClickListener按钮Listener;
//需要向Microsoft提出翻译请求
私有字符串访问令牌;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_translate);
FindView();
setAdapters();
setListeners();
//从Microsoft获取访问令牌
新建GetAccessTokenTask().execute();
}
私有void findViews(){
fromSpinner=(Spinner)findViewById(R.id.from_语言);
toSpinner=(微调器)findviewbyd(R.id.to_语言);
origText=(EditText)findViewById(R.id.original_text);
transText=(TextView)findViewById(R.id.translated_text);
transButton=(按钮)findViewById(R.id.translate_按钮);
}
/**为微调器定义数据源*/
私有void setAdapters(){
//微调器列表来自一个资源,
//微调器用户界面使用标准布局
ArrayAdapter=ArrayAdapter.createFromResource(这个,R.array.languages,android.R.layout.simple\u微调器\u项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
fromSpinner.setAdapter(适配器);
toSpinner.setAdapter(适配器);
//自动选择两个微调器项目
fromSpinner.setSelection(8);//英语(en)
toSpinner.setSelection(25);//西班牙语(es)
}
私有void setListeners(){
textWatcher=新的textWatcher(){
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
public void onTextChanged(字符序列、int start、int before、int count){
/*doTranslate2(origText.getText().toString().trim(),fromLang,toLang)*/
}
公共无效后文本已更改(可编辑){
}};
origText.addTextChangedListener(textWatcher);
itemListener=new-OnItemSelectedListener(){
已选择公共位置(AdapterView父视图、视图v、整型位置、长id){
fromLang=getLang(fromSpinner);
toLang=getLang(toSpinner);
if(accessToken!=null)
doTranslate2(origText.getText().toString().trim(),fromLang,toLang);
}
未选择公共无效(AdapterView父级){
/*无所事事*/
}};
fromSpinner.setOnItemSelectedListener(itemListener);
toSpinner.setOnItemSelectedListener(itemListener);
buttonListener=新建OnClickListener(){
公共void onClick(视图v){
if(accessToken!=null)
System.out.println(accessToken);
doTranslate2(origText.getText().toString().trim(),fromLang,toLang);
}};
transButton.setOnClickListener(buttonListener);
}
/**从当前微调器项中提取语言代码*/
私有字符串getLang(微调器微调器){
字符串结果=spinner.getSelectedItem().toString();
int lparen=result.indexOf('(');
int rparen=result.indexOf(');
result=result.substring(lparen+1,rparen);
返回结果;
}
私有void doTranslate2(字符串原始、字符串起始、字符串终止){
if(accessToken!=null)
新建TranslationTask().execute(原始、从、到);
}
私有类TranslationTask扩展了AsyncTask{
受保护的void onPostExecute(字符串转换){
transText.setText(翻译);
}
受保护的字符串背景(字符串…s){
HttpURLConnection con2=null;
字符串结果=getResources().getSt
activity_translate.xml

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TableLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:stretchColumns="1"
        android:padding="10dip">
        <TableRow>
            <TextView android:text="@string/from_text" />
            <Spinner android:id="@+id/from_language" />
        </TableRow>
        <EditText
            android:id="@+id/original_text"
            android:hint="@string/original_hint"
            android:padding="10dip"
            android:textSize="18sp" />
        <TableRow>
            <TextView android:text="@string/to_text" />
            <Spinner android:id="@+id/to_language" />
        </TableRow>
        <TextView
            android:id="@+id/translated_text"
            android:padding="10dip"
            android:textSize="18sp" />
        <Button
            android:id="@+id/translate_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Translate"
            android:layout_gravity="center" />
    </TableLayout>
</ScrollView>