2017-10-24 3 views
1

Ich erstelle eine kleine Android-Übersetzungs-App durch eine POST-HTTPS-Anfrage an eine URL und das Senden von JSON-Elementen. Ich schreibe in Android Studio und habe meinen Code in eine void-Funktion geschrieben, die beim Klicken auf eine Schaltfläche ausgeführt wird. Die von der Google Translate-API zurückgegebene Zeichenfolge wird in der Textansicht veröffentlicht. Ich habe meinen Codenummer mal bearbeitet aber es funktioniert nicht. Wenn Sie auf die Schaltfläche klicken, funktioniert die App nicht mehr auf dem Emulator.google translate api http Anfrage

Dies ist die URL und die JSON-Struktur:

POST https://translation.googleapis.com/language/translate/v2?key=YOUR_API_KEY 

Posting:

{ 
    'q': 'Hello world', 
    'target': 'de' 
} 

Anfahrt:

{ 
    "data": { 
     "translations": [ 
      { 
       "translatedText": "Hallo Welt", 
       "detectedSourceLanguage": "en" 
      } 
     ] 
    } 
} 

Dies ist mein Code:

Mein AndroidManifest. XML-Code hat die Standard-Codes, und ich habe nur enthalten diese Zeile:

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

Mein activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.amans.translate_test_2.MainActivity"> 

    <Button 
     android:id="@+id/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/button" 
     android:onClick="on_click" 
     tools:layout_constraintTop_creator="1" 
     tools:layout_constraintRight_creator="1" 
     app:layout_constraintRight_toRightOf="parent" 
     android:layout_marginTop="163dp" 
     tools:layout_constraintLeft_creator="1" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintTop_toTopOf="parent" /> 

    <TextView 
     android:id="@+id/show" 
     android:layout_width="147dp" 
     android:layout_height="92dp" 
     android:text="@string/textview" 
     tools:layout_constraintTop_creator="1" 
     tools:layout_constraintRight_creator="1" 
     app:layout_constraintRight_toRightOf="parent" 
     android:layout_marginTop="30dp" 
     app:layout_constraintTop_toBottomOf="@+id/button" 
     tools:layout_constraintLeft_creator="1" 
     app:layout_constraintLeft_toLeftOf="parent" /> 

</android.support.constraint.ConstraintLayout> 

Mein MainActivity.java:

package com.example.amans.translate_test_2; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TextView; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLEncoder; 
import java.util.LinkedHashMap; 
import java.util.Map; 

import javax.net.ssl.HttpsURLConnection; 

public class MainActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void on_click(View vv){ 
     TextView show = (TextView)findViewById(R.id.show); 
     String site = "https://translation.googleapis.com/language/translate/v2?key=YOUR_API_KEY"; 

     try { 
      URL url = new URL(site); 
      Map<String, Object> params = new LinkedHashMap<>(); 
      params.put("q", "World"); 
      params.put("target", "de"); 

      StringBuilder postData = new StringBuilder(); 
      for (Map.Entry<String, Object> param : params.entrySet()) 
      { 
       if (postData.length() != 0) postData.append('&'); 
       postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); 
       postData.append('='); 
       postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); 
      } 
      byte[] postDataBytes = postData.toString().getBytes("UTF-8"); 

      HttpsURLConnection connection = (HttpsURLConnection)url.openConnection(); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", "application/json"); 
      connection.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); 
      connection.setDoOutput(true); 
      connection.getOutputStream().write(postDataBytes); 

      Reader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); 

      StringBuilder sb = new StringBuilder(); 
      for (int c; (c = in.read()) >= 0;) 
       sb.append((char)c); 
      String response = sb.toString(); 

      JSONObject myresponse = new JSONObject(response.toString()); 

      show.setText(myresponse.getString("translatedText")); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ich bin nicht jede Art empfangen von Fehlern. Wenn ich die App starte und die Taste drücke, stoppt die Anwendung.

+0

Weiß jemand, was ich den Code schrittweise durch falsche –

+0

Versuchen mache, genau zu sehen, wo Sie scheitern. Auch als eine schnelle Überprüfung, sehen Sie, ob Sie eine statische Zeichenfolge auf Knopfdruck anzeigen können, um sicherzustellen, dass alles wie erwartet ist. – silent

+0

Netzwerkbetrieb im Hintergrund durchführen – Lingeshwaran

Antwort

0

Es gibt möglicherweise andere Probleme, aber wenn ich mich nicht täusche, müssen Sie eine Verbindung erstellen, indem Sie die Methode aufrufen. Der Anruf an openConnection() just instantiates a new URLConnection instance. Um die HTTPS-Verbindung selbst herzustellen, müssen Sie connect() anrufen.

Ziehen Sie außerdem in Betracht, den Code mit einem Debugger zu durchlaufen, damit Sie sehen können, wo der Fehler auftritt. Da Sie versuchen, auf die Schaltfläche auf (vermutlich) einer lokalen Instanz Ihres Servers zu klicken, möchten Sie wahrscheinlich eine remote debugger verwenden.

0

Sie können Hintergrundarbeit auf Hauptgewinde in Android nicht ausführen.

http://www.androidcode.in/php-full-code-with-login-and-registration-in-android

http://www.androidcode.in/php-full-code-with-login-registration-with-forgot-username-password

public class LoginAsy extends AsyncTask <String, Void, String > { 
     Context myContext; 
     String result; 

     public LoginAsy(Context c) { 
      myContext = c; 
     } 

     @Override 
     protected String doInBackground(String... params) { 

      String myurldata = "name=" + params[0] + "&email=" + params[1] + "&mobile=" + params[2] + "&username=" + params[3] + "&password=" + params[4]; 

      try { 
       URL url = new URL("http://192.168.2.3/Android/jnuproject.php"); 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setRequestMethod("POST"); 
       connection.getOutputStream().write(myurldata.getBytes()); 

       int responce = connection.getResponseCode(); 

       Log.d("Responce code ", "" + responce); 

       if (responce == HttpURLConnection.HTTP_OK) { 
        String line; 
        StringBuilder builder = new StringBuilder(); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

        while ((line = reader.readLine()) != null) { 
        builder.append(line); 
} 
        result = builder.toString(); 
       } 

      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      if (result.equals("success")) { 
       login = true; 
      } else { 
       login = false; 
      } 
      return null; 
     } 
    }