2015-04-07 1 views
2

Je suivais ce tutoriel: https://www.sinch.com/tutorials/android-messaging-tutorial-using-sinch-and-parseSinch Service ne semble pas commencer par Android Studio Parse.com (Android Messaging Tutorial)

Github pour tutoriel: https://github.com/sinch/android-messaging-tutorial

La question que j'ai est que le service ne semble pas commencer du tout. Je suis allé sur le code et ne peux pas repérer tout ce qui semble mal (mais encore une fois je suis un débutant lol).

Je ne reçois aucune diffusion dans la classe MenuFragment3 et, en raison de cela, progressDialog ne cesse de tourner. J'ai également vérifié si un service fonctionne à la fois sur un certain nombre d'émulateurs et sur un vrai périphérique, comme je l'ai dit, il semble que le service ne démarre jamais et je ne vois vraiment pas pourquoi.

Si vous avez besoin de quelque chose de plus, faites-le moi savoir et merci pour toute aide!

Tout d'abord je commence le service quand un utilisateur se connecte ici:

serviceIntent = new Intent(getApplicationContext(), MessageService.class); 
startService(serviceIntent); 

Heres le manifeste:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.yupo.dominic.yupo" > 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <activity 
     android:name=".UserAuth" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name=".Login" 
     android:label="@string/title_login_area"> 
    </activity> 
    <activity 
     android:name=".StudentLogged" 
     android:label="@string/title_student_area"> 
    </activity> 
    <activity 
     android:name=".Register" 
     android:label="@string/register"> 
    </activity> 
    <activity 
     android:name=".LectureLogged" 
     android:label="@string/title_lecture_area"> 
    </activity> 
    <service android:name=".MessageService"> 

    </service> 
</application> 

</manifest> 

Heres la classe MessageService:

package com.yupo.dominic.yupo; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 
import android.support.v4.content.LocalBroadcastManager; 

import com.parse.Parse; 
import com.parse.ParseUser; 
import com.sinch.android.rtc.ClientRegistration; 
import com.sinch.android.rtc.Sinch; 
import com.sinch.android.rtc.SinchClient; 
import com.sinch.android.rtc.SinchClientListener; 
import com.sinch.android.rtc.SinchError; 
import com.sinch.android.rtc.messaging.MessageClient; 
import com.sinch.android.rtc.messaging.MessageClientListener; 
import com.sinch.android.rtc.messaging.WritableMessage; 

public class MessageService extends Service implements SinchClientListener { 

private static final String APP_KEY = "mykeyiscorrect"; 
private static final String APP_SECRET = "mysecretiscorrect"; 
private static final String ENVIRONMENT = "sandbox.sinch.com"; 
private final MessageServiceInterface serviceInterface = new MessageServiceInterface(); 
private SinchClient sinchClient = null; 
private MessageClient messageClient = null; 
private String currentUserId; 
private LocalBroadcastManager broadcaster; 
private Intent broadcastIntent = new Intent("com.yupo.dominic.yupo.StudentLogged"); 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    Parse.initialize(this, "thisiscorrect", "thisiscorrect"); 

    currentUserId = ParseUser.getCurrentUser().getObjectId(); 

    if (currentUserId != null && !isSinchClientStarted()) { 
     startSinchClient(currentUserId); 
    } 

    broadcaster = LocalBroadcastManager.getInstance(this); 

    return super.onStartCommand(intent, flags, startId); 
} 

public void startSinchClient(String username) { 
    sinchClient = Sinch.getSinchClientBuilder().context(this).userId(username).applicationKey(APP_KEY) 
      .applicationSecret(APP_SECRET).environmentHost(ENVIRONMENT).build(); 

    sinchClient.addSinchClientListener(this); 

    sinchClient.setSupportMessaging(true); 
    sinchClient.setSupportActiveConnectionInBackground(true); 

    sinchClient.checkManifest(); 
    sinchClient.start(); 
} 

private boolean isSinchClientStarted() { 
    return sinchClient != null && sinchClient.isStarted(); 
} 

@Override 
public void onClientFailed(SinchClient client, SinchError error) { 
    broadcastIntent.putExtra("success", false); 
    broadcaster.sendBroadcast(broadcastIntent); 

    sinchClient = null; 
} 

@Override 
public void onClientStarted(SinchClient client) { 
    broadcastIntent.putExtra("success", true); 
    broadcaster.sendBroadcast(broadcastIntent); 

    client.startListeningOnActiveConnection(); 
    messageClient = client.getMessageClient(); 
} 

@Override 
public void onClientStopped(SinchClient client) { 
    sinchClient = null; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return serviceInterface; 
} 

@Override 
public void onLogMessage(int level, String area, String message) { 
} 

@Override 
public void onRegistrationCredentialsRequired(SinchClient client, ClientRegistration clientRegistration) { 
} 

public void sendMessage(String recipientUserId, String textBody) { 
    if (messageClient != null) { 
     WritableMessage message = new WritableMessage(recipientUserId, textBody); 
     messageClient.send(message); 
    } 
} 

public void addMessageClientListener(MessageClientListener listener) { 
    if (messageClient != null) { 
     messageClient.addMessageClientListener(listener); 
    } 
} 

public void removeMessageClientListener(MessageClientListener listener) { 
    if (messageClient != null) { 
     messageClient.removeMessageClientListener(listener); 
    } 
} 

@Override 
public void onDestroy() { 
    sinchClient.stopListeningOnActiveConnection(); 
    sinchClient.terminate(); 
} 

public class MessageServiceInterface extends Binder { 
    public void sendMessage(String recipientUserId, String textBody) { 
     MessageService.this.sendMessage(recipientUserId, textBody); 
    } 

    public void addMessageClientListener(MessageClientListener listener) { 
     MessageService.this.addMessageClientListener(listener); 
    } 

    public void removeMessageClientListener(MessageClientListener listener) { 
     MessageService.this.removeMessageClientListener(listener); 
    } 

    public boolean isSinchClientStarted() { 
     return MessageService.this.isSinchClientStarted(); 
    } 
} 
} 

Voici ma version de le ListUsersActivity du tutoriel (Pour moi, il est appelé MenuFragment3 qui fait partie d'un menu coulissant qui est appelé à partir du StudentLogged ou activités LectureLogged)

package com.yupo.dominic.yupo; 

import android.app.ProgressDialog; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.content.LocalBroadcastManager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.parse.FindCallback; 
import com.parse.ParseQuery; 
import com.parse.ParseUser; 

import java.util.ArrayList; 
import java.util.List; 

public class MenuFragment3 extends Fragment{ 

View rootview; 
ArrayList<String> names; 
ParseUser currentUser; 
String currentUserId; 
ListView usersListView; 
ArrayAdapter<String> namesArrayAdapter; 
ProgressDialog progressDialog; 
BroadcastReceiver receiver; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    currentUser = ParseUser.getCurrentUser(); 

    if(currentUser.getString("type").equalsIgnoreCase("Lecturer")) 
    { 
     rootview = inflater.inflate(R.layout.menu3_2_layout, container, false); 
    } 
    else 
    { 
     rootview = inflater.inflate(R.layout.menu3_layout, container, false); 
    } 

    progressDialog = new ProgressDialog(getActivity()); 
    progressDialog.setTitle("Loading"); 
    progressDialog.setMessage("Please wait..."); 
    progressDialog.show(); 

    receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Toast.makeText(getActivity(), "broadcast received", Toast.LENGTH_SHORT).show(); 

      Boolean success = intent.getBooleanExtra("success", false); 
      progressDialog.dismiss(); 
      //show a toast message if the Sinch 
      //service failed to start 
      if (!success) { 
       Toast.makeText(getActivity(), "Messaging service failed to start", Toast.LENGTH_LONG).show(); 
      } 
     } 
    }; 
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter("com.yupo.dominic.yupo.StudentLogged")); 


    currentUserId = ParseUser.getCurrentUser().getObjectId(); 
    names = new ArrayList<String>(); 
    ParseQuery<ParseUser> query = ParseUser.getQuery(); 

    query.whereNotEqualTo("objectId", currentUserId); 
    query.findInBackground(new FindCallback<ParseUser>() { 
     public void done(List<ParseUser> userList, com.parse.ParseException e) { 
      if (e == null) { 
       for (int i=0; i<userList.size(); i++) { 
        names.add(userList.get(i).getUsername().toString()); 
       } 
       usersListView = (ListView)rootview.findViewById(R.id.usersListView); 
       namesArrayAdapter = 
         new ArrayAdapter<String>(getActivity(), 
           R.layout.user_list_item, names); 
       usersListView.setAdapter(namesArrayAdapter); 
       usersListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> a, View v, int i, long l) { 
         openConversation(names, i); 
        } 
       }); 
      } else { 
       Toast.makeText(getActivity(), 
         "Error loading user list", 
         Toast.LENGTH_LONG).show(); 
      } 
     } 
    }); 

    return rootview; 
} 

public void openConversation(ArrayList<String> names, int pos) { 
    ParseQuery<ParseUser> query = ParseUser.getQuery(); 
    query.whereEqualTo("username", names.get(pos)); 
    query.findInBackground(new FindCallback<ParseUser>() { 
     public void done(List<ParseUser> user, com.parse.ParseException e) { 
      if (e == null) { 
       //Intent intent = new Intent(getActivity(), MessagingActivity.class); 
       //intent.putExtra("RECIPIENT_ID", user.get(0).getObjectId()); 
       //startActivity(intent); 

       Toast.makeText(getActivity(), 
         "working", 
         Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(getActivity(), 
         "Error finding that user", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
} 
} 
+0

Si vous avez utilisé ma réponse ci-dessous, pourriez-vous la marquer comme acceptée? Merci! – mravca

Répondre

1

Vous essayez d'initialiser Parse en utilisant votre clé Sinch et secret. En outre, vous devez initialiser Parse dans la méthode onCreate de votre application. Essayez:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

    currentUserId = ParseUser.getCurrentUser().getObjectId(); 

    if (currentUserId != null && !isSinchClientStarted()) { 
     startSinchClient(currentUserId); 
    } 

    broadcaster = LocalBroadcastManager.getInstance(this); 

    return super.onStartCommand(intent, flags, startId); 
}