0

我使用兩個移動設備之間的Firebase做了一個聊天應用程序,然後我創建了一個按鈕來使用Google API客戶端發送設備的位置,但它仍然返回null,儘管我在另一個活動中嘗試過它,並且它工作正常。 聊天室::融合的位置返回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) { 

    } 


} 

主要活動::

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

請更具體一點,我找不到您用來發送位置的點擊。 – Ibrahim

+0

@IbrahimAli按鈕在聊天室發送類 –

+0

'我創建了一個按鈕來發送設備的位置'我找不到這部分代碼。 – Ibrahim

回答

0

該設備使用的是如果你使用的設備是具有目標更然後6.0那麼你有沒有提它行不通考慮以下代碼

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; 
     } 

這裏我看不到代碼進行定位請求,如果允許在你的應用程序授予那麼就會直接返回而不進行位置請求。

考慮以下鏈接 http://javapapers.com/android/android-location-fused-provider/

+0

我的目標是棒棒糖5.0 –

+0

好吧,但我不能看到位置監聽器註冊您的代碼「requestLocationUpdates」 –

+0

我添加了「請求位置更新」,但仍然返回空 –

0

首先連接到播放服務是一個異步過程。根據你的代碼,你的「發送」按鈕不知道這個過程。所以這是接收null的最可能的原因。

甚至這一步也不是問題(偶然,在按發送之前觸發onConnected回調)還有權限檢查。你對此沒有任何意見,而且,從提供者獲取最後一個已知位置往往爲空。你必須要求新的位置。你只需調用這個createLocationRequest();但它沒有發出位置請求。

以上都是你爲什麼變爲null的原因。只考慮所有這些。