مشكلة في تصميم برنامج شات على اندرويد

ناصر حوباني • منذ 6 سنوات

السلام عليكم

الشات يكون مرتبط بسيرفر خارجي وخدمة firebase cloud messaging وعند تنفيذ البرنامج يظهرلي الخطأ هذا 

Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 45 path $

هذا ملف الاكتفيتي

package com.mndoobk.nasser.mndoobk3;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.google.firebase.messaging.FirebaseMessaging;
import com.mndoobk.nasser.mndoobk3.adapters.MessageAdapter;
import com.mndoobk.nasser.mndoobk3.modesl.MainRespnse;
import com.mndoobk.nasser.mndoobk3.modesl.Message;
import com.mndoobk.nasser.mndoobk3.utils.Session;
import com.mndoobk.nasser.mndoobk3.webservice.WebService;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

public class ChatActivity extends AppCompatActivity {

    RecyclerView recyclerChat;
    @BindView(R.id.view_chat)
    View chatView;
    @BindView(R.id.pic_send)
    ImageView chatSend;
    @BindView(R.id.pic_atach)
    ImageView chatAtach;
    @BindView(R.id.message_box)
    EditText messageBox;
    @BindView(R.id.contentChat)
    LinearLayout contentChat;


    int roomid = 0;
    int user_id;
    String roomName;
    String username;
    MessageAdapter adapter;
    List<Message> messages;

    private BroadcastReceiver messageRecevier = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Message message = intent.getParcelableExtra("msg");
            if (message != null) {
                messages.add(message);
                adapter.notifyItemInserted(messages.size() - 1);
                recyclerChat.scrollToPosition(messages.size() - 1);
            }
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        ButterKnife.bind(this);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        // get room ID and room name
        roomid = getIntent().getExtras().getInt("room_id");
        roomName = getIntent().getExtras().getString("room_name");
        // set room name as toolbar title
        if (getSupportActionBar() != null) getSupportActionBar().setTitle(roomName);
        // display back button in toolbar
        if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        recyclerChat = findViewById(R.id.rec_chat);

        user_id = Session.getInstance().getUser().id;
        username = Session.getInstance().getUser().name;


        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerChat.setLayoutManager(layoutManager);

        getMessags(roomid);

        FirebaseMessaging.getInstance().subscribeToTopic("room" + roomid);
        Log.e("room topic is ", "room" + roomid);
    }

    private void getMessags(int roomid) {

        WebService.getInstance().getApi().getMessage(roomid).enqueue(new Callback<List<Message>>() {
            @Override
            public void onResponse(Call<List<Message>> call, Response<List<Message>> response) {
                messages = response.body();
                adapter = new MessageAdapter(messages, ChatActivity.this);
                recyclerChat.setAdapter(adapter);
                recyclerChat.scrollToPosition(messages.size() - 1);
            }

            @Override
            public void onFailure(Call<List<Message>> call, Throwable t) {
                Toast.makeText(ChatActivity.this, t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                Log.e("ERROR", t.getLocalizedMessage());
            }
        });
    }

    private void addMessage(Message message) {
        WebService.getInstance().getApi().addMessage(message).enqueue(new Callback<MainRespnse>() {
            @Override
            public void onResponse(Call<MainRespnse> call, Response<MainRespnse> response) {
                if (response.body().Success == 0) {
                    Toast.makeText(ChatActivity.this, "خطأ اثناء ارسال الرسالة", Toast.LENGTH_LONG).show();
                }
            }

            @Override
            public void onFailure(Call<MainRespnse> call, Throwable t) {
                Toast.makeText(ChatActivity.this, t.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                Log.e("ERROR", t.getLocalizedMessage());
            }
        });
    }

    @OnClick({R.id.pic_send, R.id.pic_atach})
    public void onClick(View view) {
        switch (view.getId()) {

            case R.id.pic_atach:
                break;
            case R.id.pic_send:
                if (messageBox.getText().toString().isEmpty()) return;

                String msg = messageBox.getText().toString();
                Message message = new Message();
                message.setType("1");
                message.setRoom_id(String.valueOf(roomid));
                message.setUser_id(String.valueOf(user_id));
                message.setUser_name(username);
                message.setContent(msg);
                messages.add(message);
                adapter.notifyItemInserted(messages.size() - 1);
                recyclerChat.scrollToPosition(messages.size() - 1);
                messageBox.setText("");
                addMessage(message);
                break;


        }


    }

    @Override
    protected void onResume() {
        super.onResume();
        registerReceiver(messageRecevier, new IntentFilter("UpdateChateActivity"));
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterReceiver(messageRecevier);
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) finish();
        return super.onOptionsItemSelected(item);
    }
}

وهذا ملف الphp الخاص باضافة الرسالة

<?php
require "DB.php";
$data = file_get_contents("php://input");
$obj = json_decode($data);

$db = DB::getInstance();

header('Content-Type: application/json');



if (!isset($obj->{'room_id'})){
    print "{\"Success\": 0,\"Message\":\"لم يتم ايجاد الغرفة\"}";
}elseif (!isset($obj->{'user_id'})){
    print "{\"Success\": 0,\"Message\":\"لم يتم ايجاد المستخدم\"}";
}elseif (!isset($obj->{'user_name'})){
    print "{\"Success\": 0,\"Message\":\"لم يتم ايجاد المستخدم2\"}";
}elseif (!isset($obj->{'type'})){
    print "{\"Success\": false,\"Message\":\"لم يتم ادحال اي بيانات\"}";
}elseif (!isset($obj->{'content'})){
    print "{\"Success\": 0,\"Message\":\"لم يتم ادخال اي رسالة\"}";
}else {
    // store room name and desc in variables
    $room_id = $obj->{'room_id'};
    $user_id = $obj->{'user_id'};
    $user_name = $obj->{'user_name'};
    $type = $obj->{'type'};
    $content = $obj->{'content'};
    // make query using marei db
    $insertnewmessage = $db->insert('message',[
        'room_id' => $room_id,
        'user_id' => $user_id,
        'user_name' => $user_name,
        'type' => $type,
        'content' => $content
    ]);
    // check if query executed
    if($insertnewmessage){
        print "{\"Success\": 1,\"Message\":\"تم ارسال الرسالة\"}";
    }else{
        print "{\"Success\": 0,\"Message\":\"خطأ اثناء ارسال الرسالة\"}";
    }
    $date = date("Y-m-d h:i:s");
    $url = 'https://fcm.googleapis.com/fcm/send';

    $fcmdata =  "{
       \"to\": \"/topics/room5\",
       \"data\": {
       \"message\": \"".$content."\",
       \"room_id\":\"".$room_id."\",
       \"user_id\":\"".$user_id."\",
       \"username\":\"".$user_name."\",
       \"type\":\"".$type."\",
       \"timestamp\":\"".$date."\"
   }
}";
    //************   rplace this with your api key ***************//
    define("GOOGLE_API_KEY", "AIzaSyCX1Vc4iHoz-iD17tZIy-LcYg0LS3lAYsg");
    $headers = array(
        'Authorization: key=' . GOOGLE_API_KEY,
        'Content-Type: application/json'
    );
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS,   $fcmdata);
    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }
    curl_close($ch);
    echo $result;
}

اتمنى اكون اني وصلت فكرة المشكلة 

كلمات دليلية: android java php

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !