2016-04-27 11 views
1

Ich versuche, eine Anwendung zu erstellen, die zwei Geräte ermöglicht, mithilfe von WLAN direkt zu verbinden und eine Nachricht von einem Gerät zum anderen in einem JSON-Dateiformat zu senden und dann zu analysieren diese Datei in eine Textansicht. Bis jetzt mache ich mir keine Sorgen über den WLAN-Teil, weil ich weiß, dass es sehr schwierig ist und ich möchte mit dem "einfachen" Teil meines Projekts beginnen. Ich habe diesen Code bisher.Erstellen Sie eine JSON-Datei und senden Sie sie an ein anderes Gerät mit WIFI direct

import android.content.Context; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import org.json.JSONArray; 
import org.json.JSONObject; 

import java.text.DateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

public class MainActivity extends AppCompatActivity { 

    EditText edtx1; 
    TextView txvw1; 
    TextView txvw2; 
    TextView txvw3; 
    TextView txvw4; 
    TextView txvw5; 
    Button btn; 
    String Message; 
    String currentDateTimeString = DateFormat.getDateTimeInstance().format(new Date()); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     btn = (Button) findViewById(R.id.button); 
     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       edtx1 = (EditText) findViewById(R.id.editText1); 
       txvw1 = (TextView) findViewById(R.id.textView1); 
       txvw2 = (TextView) findViewById(R.id.textView2); 
       txvw3 = (TextView) findViewById(R.id.textView3); 
       txvw4 = (TextView) findViewById(R.id.textView4); 
       txvw5 = (TextView) findViewById(R.id.textView5); 
       //txvw1.setText(edtx1.getText().toString()); 
       makeJSON(); 
      } 
     }); 
    } 

    public JSONArray makeJSON() { 
     JSONArray jArr = new JSONArray(); 
     JSONObject jObj = new JSONObject(); 
     try { 

      WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
      WifiInfo wInfo = wifiManager.getConnectionInfo(); 
      String macAddress = wInfo.getMacAddress(); 

      //Long tsLong = System.currentTimeMillis()/1000; 
      //String ts = tsLong.toString(); 

      jObj.put("Created_on:", currentDateTimeString); 
      jObj.put("Sent_by:", Build.MODEL); 
      jObj.put("MAC_Address:", macAddress); 
      jObj.put("Number_of_Hops:", 1); 
      jObj.put("Message:", edtx1.getText()); 

      txvw1.setText(jObj.getString("Created_on:")); 
      txvw2.setText(jObj.getString("Sent_by:")); 
      txvw3.setText(jObj.getString("MAC_Address:")); 
      txvw4.setText(jObj.getString("Number_of_Hops:")); 
      txvw5.setText(jObj.getString("Message:")); 

      jArr.put(jObj); 

     } catch (Exception e) { 
      System.out.println("Error:" + e); 
     } 

     return jArr; 
    } 
} 

Ich möchte einen Knopf haben und wenn nur senden, um die Informationen über die EditText zum JSON-Objekt namens Nachricht angeklickt. Also am Ende werde ich so etwas haben

{ 
    "Created on": Date, 
    "Sent By": "name", 
    "MAC Address": "FF:FF:FF:FF:FF:FF", 
    "Number of Hops": "This number I will figure it out later", 
    "Message": "Message" 
} 

Und dann diese Datei an das andere Gerät senden.

UPDATE:

ich den Code oben gerade bearbeitet und jetzt ist es eine Art von Arbeit, zumindest ich denke, das tut, was ich will. Das Problem ist hier mit dem Gerätenamen und der MAC-Adresse. Ich weiß, dass jetzt die MAC-Adresse nicht innerhalb der App genommen werden kann, aber ich kann nur diesen Teil ausfüllen und statisch machen. Aber wie kann ich den namen des gerätes zum beispiel mein gerät heißt "Daniel" wie kann ich das mit einem code abgerufen?

Antwort

0

Ich habe dies nicht getestet, aber das könnte helfen.

Hier sind die offiziellen Dokumente für die Verwendung von Wi-Fi-direct im Fall, dass Sie sie

android docs: wifi-direct

Sie können versuchen, Ihre JSON-Objekt über als String zu senden (das, was ich tue, wenn ich POST zu meinem Server) und auf der anderen Seite parsen Sie es wie ein Standard-JSON.

Uri.Builder builder = new Uri.Builder(); 
builder.appendQueryParameter("key_1", "value_1"); 
builder.appendQueryParameter("key_2", "value_2"); 
String json = builder.build().getEncodedQuery(); 

Sobald Sie haben eine Klasse gebaut, um die Daten von ihm zu erhalten und dann mit .setText() gesetzt

lassen Sie mich wissen, wenn Sie ein Beispiel auf benötigen, wie das zu tun.

--- EDIT ---

so weit war Ihr Gerätenamen bekommen, fand ich diese Code-Schnipsel, die für Sie arbeiten sollten, solange Sie mit Bitte um Bluetooth-Erlaubnis sind ok.

fügen Sie diese zu Ihrem Manifest

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

und in Ihrem Code

public String getPhoneName(){ 
    BluetoothAdapter myDevice = BluetoothAdapter.getDefaultAdapter(); 
    String deviceName = myDevice.getName();  
    return deviceName; 
} 
+0

Vielen Dank für Ihre Hilfe Thomas. Ich habe es geschafft, das Json-Objekt zu erstellen und es auf dem gleichen Gerät zu zeigen (dies beim Testen von Schweinswalen). Ich werde meinen Code bearbeiten, damit du ihn dir ansehen und mir sagen kannst, ob ich etwas tun kann, um ihn zu verbessern. Eigentlich bin ich mir nicht einmal sicher, ob ich das JSON-Objekt erstelle oder es einfach vor dem Erstellen in der Ansicht poste. –

+0

Thomas, danke nochmal für deine Hilfe Ich habe den Code benutzt, den du gepostet hast, um den Namen des Geräts zu erhalten und es hat funktioniert. Jetzt erstellt die App die JSON-Datei und jetzt gehe ich für den direkten WLAN-Verbindungsteil, also wenn Sie Code oder Tutorial haben, die ich benutze, würde ich es schätzen. –

Verwandte Themen