2016-04-06 8 views
0

Ich versuche, Android-App zu entwickeln, die Audio und Video über das WebRTC-Protokoll zwischen Geräten senden wird. Dieser Code funktioniert gut mit Android und Web-Interface, aber nicht zwischen zwei Androids. Jedes Mal, wenn die Verbindung geöffnet wird und ein Popup anzeigt, dass Geräte verbunden sind, aber kein Ton und Bild. Ich habe viele Dinge ausprobiert, aber nichts half. Abhängigkeiten und Berechtigungen sind in Ordnung. Benutzte meine eigenen Pub und Sub Schlüssel von PubNub. Es öffnet die Verbindung 1 von 20 mal zwischen zwei Androiden, also denke ich, dass hier etwas nicht gut funktioniert.Video und Audio-Anruf 2 Android-Geräte - webrtc

dieses Tutorial Gefolgt App zu erstellen: tutorial

ich diesen Fehler gefunden image

Kamera irgendwo abstürzt, aber ich weiß wirklich nicht, warum.

public static final String VIDEO_TRACK_ID = "videoPN"; 
public static final String AUDIO_TRACK_ID = "audioPN"; 
public static final String LOCAL_MEDIA_STREAM_ID = "localStreamPN"; 

private PnRTCClient pnRTCClient; 
private VideoSource localVideoSource; 
private VideoRenderer.Callbacks localRender; 
private VideoRenderer.Callbacks remoteRender; 
private GLSurfaceView mVideoView; 

private String username; 

private class MyRTCListener extends PnRTCListener { 

    @Override 
    public void onLocalStream(final MediaStream localStream) { 
     VideoChatActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       if(localStream.videoTracks.size()==0) return; 
       localStream.videoTracks.get(0).addRenderer(new VideoRenderer(localRender)); 
      } 
     }); 
    } 


    @Override 
    public void onAddRemoteStream(final MediaStream remoteStream, final PnPeer peer) { 
     VideoChatActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(VideoChatActivity.this,"Connected to " + peer.getId(), Toast.LENGTH_SHORT).show(); 
       try { 
        if(remoteStream.videoTracks.size()==0) return; 
        remoteStream.videoTracks.get(0).addRenderer(new VideoRenderer(remoteRender)); 
        VideoRendererGui.update(remoteRender, 0, 0, 100, 100, VideoRendererGui.ScalingType.SCALE_ASPECT_FILL, false); 
        VideoRendererGui.update(localRender, 72, 72, 25, 25, VideoRendererGui.ScalingType.SCALE_ASPECT_FIT, true); 
       } 
       catch (Exception e){ e.printStackTrace(); } 
      } 
     }); 
    } 

    @Override 
    public void onPeerConnectionClosed(PnPeer peer) { 
     Intent intent = new Intent(VideoChatActivity.this, MainActivity.class); 
     startActivity(intent); 
     finish(); 
    } 

} 



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

    Bundle extras = getIntent().getExtras(); 
    if (extras == null || !extras.containsKey(Constants.USER_NAME)) { 
     Intent intent = new Intent(this, MainActivity.class); 
     startActivity(intent); 
     Toast.makeText(this, "Need to pass username to VideoChatActivity in intent extras (Constants.USER_NAME).", 
       Toast.LENGTH_SHORT).show(); 
     finish(); 
     return; 
    } 
    this.username = extras.getString(Constants.USER_NAME, ""); 

    PeerConnectionFactory.initializeAndroidGlobals(
      this, // Context 
      true, // Audio Enabled 
      true, // Video Enabled 
      true, // Hardware Acceleration Enabled 
      null); // Render EGL Context 

    PeerConnectionFactory pcFactory = new PeerConnectionFactory(); 
    this.pnRTCClient = new PnRTCClient(Constants.PUB_KEY, Constants.SUB_KEY, this.username); 

    int camNumber = VideoCapturerAndroid.getDeviceCount(); 
    String frontFacingCam = VideoCapturerAndroid.getNameOfFrontFacingDevice(); 
    String backFacingCam = VideoCapturerAndroid.getNameOfBackFacingDevice(); 

    VideoCapturerAndroid capturer = (VideoCapturerAndroid) VideoCapturerAndroid.create(frontFacingCam); 

    localVideoSource = pcFactory.createVideoSource(capturer, this.pnRTCClient.videoConstraints()); 
    VideoTrack localVideoTrack = pcFactory.createVideoTrack(VIDEO_TRACK_ID, localVideoSource); 

    AudioSource audioSource = pcFactory.createAudioSource(this.pnRTCClient.audioConstraints()); 
    AudioTrack localAudioTrack = pcFactory.createAudioTrack(AUDIO_TRACK_ID, audioSource); 

    MediaStream mediaStream = pcFactory.createLocalMediaStream(LOCAL_MEDIA_STREAM_ID); 

    mediaStream.addTrack(localVideoTrack); 
    mediaStream.addTrack(localAudioTrack); 

    this.mVideoView = (GLSurfaceView) findViewById(R.id.gl_surface); 

    VideoRendererGui.setView(mVideoView, null); 


    remoteRender = VideoRendererGui.create(0, 0, 100, 100, VideoRendererGui.ScalingType.SCALE_ASPECT_FILL, false); 
    localRender = VideoRendererGui.create(0, 0, 100, 100, VideoRendererGui.ScalingType.SCALE_ASPECT_FILL, true); 

    this.pnRTCClient.attachRTCListener(new MyRTCListener()); 
    this.pnRTCClient.attachLocalMediaStream(mediaStream); 

    this.pnRTCClient.listenOn(this.username); 
    this.pnRTCClient.setMaxConnections(1); 

    if (extras.containsKey(Constants.JSON_CALL_USER)) { 
     String callUser = extras.getString(Constants.JSON_CALL_USER, ""); 
     connectToUser(callUser); 
    } 

} 
public void connectToUser(String user) { 
    this.pnRTCClient.connect(user); 
} 

public void hangup(View view) { 
    this.pnRTCClient.closeAllConnections(); 
    startActivity(new Intent(VideoChatActivity.this, MainActivity.class)); 

} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (this.localVideoSource != null) { 
     localVideoSource.stop(); 
    } 
    if (this.pnRTCClient != null) { 
     this.pnRTCClient.onDestroy(); 
     this.pnRTCClient.closeAllConnections(); 
    } 
} 

Hier ist MainActivity wenn es helfen:

private SharedPreferences mSharedPreferences; 
private TextView mUsernameTV; 
private EditText mCallNumET; 
// private Pubnub mPubNub; 
private String username; 
private Pubnub mPubNub; 

public void initPubNub() { 
    String stdbyChannel = this.username + Constants.STDBY_SUFFIX; 
    this.mPubNub = new Pubnub(Constants.PUB_KEY, Constants.SUB_KEY); 
    this.mPubNub.setUUID(this.username); 
    try { 
     this.mPubNub.subscribe(stdbyChannel, new Callback() { 
      @Override 
      public void successCallback(String channel, Object message) { 
       Log.d("MA-success", "MESSAGE: " + message.toString()); 
       if (!(message instanceof JSONObject)) return; // Ignore if not JSONObject 
       JSONObject jsonMsg = (JSONObject) message; 
       try { 
        if (!jsonMsg.has(Constants.JSON_CALL_USER)) return; 
        String user = jsonMsg.getString(Constants.JSON_CALL_USER); 
        // Consider Accept/Reject call here 
        Intent intent = new Intent(MainActivity.this, VideoChatActivity.class); 
        intent.putExtra(Constants.USER_NAME, username); 
        intent.putExtra(Constants.JSON_CALL_USER, user); 
        startActivity(intent); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } catch (PubnubException e) { 
     e.printStackTrace(); 
    } 
} 


public void makeCall(View view){ 
    String callNum = mCallNumET.getText().toString(); 
    if (callNum.isEmpty() || callNum.equals(this.username)) { 
     Toast.makeText(this, "Enter a valid number.", Toast.LENGTH_SHORT).show(); 
    } 
    dispatchCall(callNum); 
} 

public void dispatchCall(final String callNum) { 
    final String callNumStdBy = callNum + Constants.STDBY_SUFFIX; 
    JSONObject jsonCall = new JSONObject(); 
    try { 
     jsonCall.put(Constants.JSON_CALL_USER, this.username); 
     mPubNub.publish(callNumStdBy, jsonCall, new Callback() { 
      @Override 
      public void successCallback(String channel, Object message) { 
       Log.d("MA-dCall", "SUCCESS: " + message.toString()); 
       Intent intent = new Intent(MainActivity.this, VideoChatActivity.class); 
       intent.putExtra(Constants.USER_NAME, username); 
       intent.putExtra(Constants.JSON_CALL_USER, callNum); 
       startActivity(intent); 
      } 
     }); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 


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

    this.mSharedPreferences = getSharedPreferences(Constants.SHARED_PREFS, MODE_PRIVATE); 
    // Return to Log In screen if no user is logged in. 
    if (!this.mSharedPreferences.contains(Constants.USER_NAME)){ 
     Intent intent = new Intent(this, LoginActivity.class); 
     startActivity(intent); 
     finish(); 
     return; 
    } 
    this.username = this.mSharedPreferences.getString(Constants.USER_NAME, ""); 

    this.mCallNumET = (EditText) findViewById(R.id.call_num); 
    this.mUsernameTV = (TextView) findViewById(R.id.main_username); 

    this.mUsernameTV.setText(this.username); // Set the username to the username text view 

    //TODO: Create and instance of Pubnub and subscribe to standby channel 
    // In pubnub subscribe callback, send user to your VideoActivity 
    initPubNub(); 

} 

Ich werde jede Hilfe dankbar. Danke an Alle.

+0

Anscheinend Sie die Kamera Prozess gesperrt. Starten Sie Ihr Telefon neu. –

+0

Danke, aber hat nicht geholfen. – Katz

+0

Nichts PubNub hier verwandt, AFAICT. Lassen Sie uns wissen, wenn Sie Ursache und Lösung finden. –

Antwort

0

, wenn Sie Ihre Anwendung ausführen, die Zeit, die sie Zeichen fragen in usename , dass Zeit, die Sie Ihren Namen

schrieb

setzen diesen Namen in VideoChatActivity Klasse

this.pnRTCClient.listenOn("your name when your wrote at signin time"); 
this.pnRTCClient.setMaxConnections(3); 
+0

Hallo, ich habe das versucht aber nicht geholfen..aber danke für die Antwort. Vielleicht eine andere Idee? – Katz

+0

Folgen Sie dieser Anleitung: - [Link] (https://github.com/GleasonK/AndroidRTC) es wird Ihnen sicher helfen und stellen Sie sicher, ändern Sie Ihren Benutzernamen .. – Sunny

Verwandte Themen