0

Ich habe eine Chat-Anwendung mit Firebase zwischen zwei mobilen Geräten erstellt, dann habe ich eine Schaltfläche erstellt, um den Standort des Geräts mit Google API-Client zu senden, aber es liefert immer Null, obwohl ich es in einer anderen Aktivität versucht und es hat gut funktioniert . Chatroom ::Fused location Rückgabe NULL

public class Chat_room extends Activity implements ConnectionCallbacks,OnConnectionFailedListener, LocationListener { 

    Button btnsend, btnGps; 
    TextView recievedmsg, txtgps; 
    EditText editmsg; 

    DatabaseReference rootRoomName; 

    String roomname; 
    String username; 
    private String chatusername; 
    private String chatmessage; 
    String Response; 
    private GoogleApiClient GAC; 
    LocationRequest LR; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     build_GAC(); 
     setContentView(R.layout.activity_chat_room); 
     btnsend = (Button) findViewById(R.id.btnsend); 
     btnGps = (Button) findViewById(R.id.btnGps); 
     recievedmsg = (TextView) findViewById(R.id.recievedmsg); 
     editmsg = (EditText) findViewById(R.id.editmsg); 
     txtgps = (TextView) findViewById(R.id.txtgps); 



     roomname = getIntent().getExtras().get("Room_Name").toString(); 
     username = getIntent().getExtras().get("UserName").toString(); 

     setTitle(roomname); 
     rootRoomName = FirebaseDatabase.getInstance().getReference().getRoot().child(roomname); 
     btnsend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       DatabaseReference childRoot = rootRoomName.push(); 
       Map<String, Object> map = new HashMap<String, Object>(); 
       map.put("Name", username); 
       map.put("message",Response); 
       childRoot.updateChildren(map); 


//    } 
      } 
     }); 

     rootRoomName.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 

       update_message(dataSnapshot); 
      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

       update_message(dataSnapshot); 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

    private void update_message(DataSnapshot dataSnapshot) { 
     chatusername = (String) dataSnapshot.child("Name").getValue(); 
     chatmessage = (String) dataSnapshot.child("message").getValue(); 

     recievedmsg.append(chatusername + ":" + chatmessage + "\n\n"); 
    } 

    protected void build_GAC(){ 
     GAC =new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     if (GAC != null) { 
      GAC.connect(); 
     } 
    } 

    @Override 

    protected void onStop() { 
     GAC.disconnect(); 
     super.onStop(); 
    } 


    @Override 
    public void onConnected(Bundle connectionHint) { 
     createLocationRequest(); 
     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     Location Location = LocationServices.FusedLocationApi.getLastLocation(GAC); 
     if (Location != null) { 
      Double Lat = Location.getLatitude(); 
      Double lon = Location.getLongitude(); 
      Response=("Ltitude is " + String.valueOf(Lat) + "\n" + "Longitude is " + String.valueOf(lon)); 

     } 
    } 
    protected void createLocationRequest() { 
     LR = new LocationRequest(); 
     LR.setInterval(2000); 
     LR.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    } 


    @Override 
    public void onConnectionSuspended(int i) { 
     Toast.makeText(this, "the connection suspended", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
     Toast.makeText(this, "the connection failed", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     Response=("Ltitude is " + String.valueOf(location.getLatitude()) + "\n \n" + "Longitude is " + String.valueOf(location.getLongitude())); 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 


} 

Hauptaktivität ::

public class MainActivity extends AppCompatActivity { 
    EditText roomname; 
    Button join; 
    ListView roomlist; 
    ArrayList<String> roomarraylist; // to store rooms list 
    ArrayAdapter<String> roomadapter; 

    DatabaseReference databaseReference; 
    public String username; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     roomname=(EditText)findViewById(R.id.editText); 
     join=(Button)findViewById(R.id.button2); 

     roomlist=(ListView)findViewById(R.id.roomlistview); 
     roomarraylist=new ArrayList<String>(); 
     roomadapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,roomarraylist); 

     roomlist.setAdapter(roomadapter); 

     databaseReference= FirebaseDatabase.getInstance().getReference().getRoot(); 

     request_username(); 
     join.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Map<String,Object> map=new HashMap<String, Object>(); 
       map.put(roomname.getText().toString(),""); 
       databaseReference.updateChildren(map); 
      } 
     }); 
     databaseReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Iterator iterator =dataSnapshot.getChildren().iterator(); 
       Set<String> set=new HashSet<String>(); 

       while (iterator.hasNext()){ 
        // GET NAMES OF ALL ROOMS ONE BY ONE FROM DATABASE 
        set.add((String) ((DataSnapshot)iterator.next()).getKey()); 
       } 
       roomarraylist.clear(); 
       roomarraylist.addAll(set); 

       roomadapter.notifyDataSetChanged(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     roomlist.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Intent intent=new Intent(MainActivity.this,Chat_room.class); 
       intent.putExtra("Room_Name",((TextView)view).getText().toString()); 
       intent.putExtra("UserName",username); 
       startActivity(intent); 
      } 
     }); 
    } 

    private void request_username() { 
     AlertDialog.Builder builder=new AlertDialog.Builder(this); 
     builder.setTitle("Please Enter your Name"); 
     final EditText edittext=new EditText(this); 
     builder.setView(edittext); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       username=edittext.getText().toString(); 
       if(!TextUtils.isEmpty(username)){ 

       } 
       else{ 
        request_username(); 
       } 
      } 
     }).setNegativeButton("Quit", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
       request_username(); 
      } 
     }); 

     builder.show(); 
    } 
} 
+0

bitte genauer, ich kann den Klick nicht finden Sie verwendet, um den Standort zu senden.! – Ibrahim

+0

@IbrahimAli die Schaltfläche senden im Chat-Raum Klasse –

+0

'Ich habe eine Schaltfläche zum Senden der Position des Geräts erstellt 'Ich kann diesen Teil des Codes nicht finden. – Ibrahim

Antwort

0

Sie haben nicht erwähnt, welches Gerät Sie verwenden, wenn das Gerät Sie verwenden Ziel mehr ist, die dann 6,0 dann seine nicht als zur Arbeit zu gehen folgende

Code
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 

Hier kann ich nicht Code sieht für die Herstellung von Standortanforderung, wenn die Erlaubnis in Ihrer App gewährt wird, dann wird es direkt zurück, ohne Ort zu machen Anfrage.

Betrachten Sie folgenden Link http://javapapers.com/android/android-location-fused-provider/

+0

Ich bin auf Lollipop 5,0 zielen –

+0

Ok, aber ich kann nicht Ort Listener Registrierung in Ihrem Code "requestLocationUpdates" –

+0

Ich fügte hinzu, "Standort Update anfordern", aber immer noch null zurückgibt –

0

Zunächst einmal zu den Play-Dienste Anschluss eines Asynchron-Prozess ist. Basierend auf Ihrem Code ist Ihre "Senden" -Schaltfläche diesem Prozess nicht bekannt. Dies ist der wahrscheinlichste Grund für den Empfang von null.

Und auch dieser Schritt ist kein Problem (zufällig wird der onConnected Callback ausgelöst, bevor Sie send drücken), es gibt auch eine Berechtigungsprüfung. Sie haben nichts über diese

Und auch, die letzte bekannte Position von Anbietern ist tendenziell Null. Sie müssen einen neuen Standort anfordern. Sie rufen dies einfach createLocationRequest();, aber es hat keine Standortanfrage gestellt.

Das alles oben ist der Grund warum Sie null bekommen. Denken Sie nur an alle.

Verwandte Themen