无法实例化Sinch客户端 - NullPointerException错误

时间:2016-12-23 21:10:05

标签: java android nullpointerexception sinch

我正在使用Sinch教程(https://github.com/sinch/android-app-app-calling-headers)作为我正在尝试开发的应用程序的框架。以下是本教程中的登录类,我已经更新并成功初始化了sinch客户端。

DListNode

客户端的实例化发生在SinchService类中,如下所示:

public class LoginActivity extends BaseActivity implements SinchService.StartFailedListener {

private Button mLoginButton;
private EditText mLoginName;
private static final int REQUEST_PERMISSION = 10;

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

    mLoginName = (EditText) findViewById(R.id.loginName);
    mLoginButton = (Button) findViewById(R.id.loginButton);
    mLoginButton.setEnabled(false);

    requestAppPermissions(new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_FINE_LOCATION}, R.string.msg,  REQUEST_PERMISSION);
    mLoginButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            loginClicked();
        }
    });

}

@Override
public void onPermissionGranted(int requestCode) {

}

@Override
protected void onServiceConnected() {
    mLoginButton.setEnabled(true);
    getSinchServiceInterface().setStartListener(this);
}

@Override
protected void onPause() {
    super.onPause();
}

@Override
public void onStartFailed(SinchError error) {
    Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show();
}

@Override
public void onStarted() {
    openPlaceCallActivity();
}

private void loginClicked() {
    String userName = mLoginName.getText().toString();

    if (userName.isEmpty()) {
        Toast.makeText(this, "Please enter a name", Toast.LENGTH_LONG).show();
        return;
    }

    if (!getSinchServiceInterface().isStarted()) {
        getSinchServiceInterface().startClient(userName);
    } else {
        openPlaceCallActivity();
    }
}

private void openPlaceCallActivity() {
    Intent mainActivity = new Intent(this, PlaceCallActivity.class);
    startActivity(mainActivity);
    }

}

出于我的目的,我需要从我的共享首选项文件夹中获取客户端的用户名。我创建了一个虚拟应用程序,使用上面相同的框架添加共享首选项,但我总是得到一个NullPointerException错误。以下是我的虚拟应用程序中的登录类。

 private static final String APP_KEY = "";
private static final String APP_SECRET = "";
private static final String ENVIRONMENT = "sandbox.sinch.com";
public static final String LOCATION = "LOCATION";
public static final String CALL_ID = "CALL_ID";
static final String TAG = SinchService.class.getSimpleName();

private SinchServiceInterface mSinchServiceInterface = new SinchServiceInterface();
private SinchClient mSinchClient;
private String mUserId;

private StartFailedListener mListener;

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public void onDestroy() {
    if (mSinchClient != null && mSinchClient.isStarted()) {
        mSinchClient.terminate();
    }
    super.onDestroy();
}

private void start(String userName) {

    if (mSinchClient == null) {
        mUserId = userName;
        mSinchClient = Sinch.getSinchClientBuilder().context(getApplicationContext()).userId(userName)
                .applicationKey(APP_KEY)
                .applicationSecret(APP_SECRET)
                .environmentHost(ENVIRONMENT).build();

        mSinchClient.setSupportCalling(true);
        mSinchClient.startListeningOnActiveConnection();

        mSinchClient.addSinchClientListener(new MySinchClientListener());
        mSinchClient.getCallClient().addCallClientListener(new SinchCallClientListener());
        mSinchClient.start();
    }
}

private void stop() {
    if (mSinchClient != null) {
        mSinchClient.terminate();
        mSinchClient = null;
    }
}

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

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

public class SinchServiceInterface extends Binder {

    public Call callPhoneNumber(String phoneNumber) {
        return mSinchClient.getCallClient().callPhoneNumber(phoneNumber);
    }

    public Call callUser(String userId) {
        return mSinchClient.getCallClient().callUser(userId);
    }

    public Call callUser(String userId, Map<String, String> headers) {
        return mSinchClient.getCallClient().callUser(userId, headers);
    }

    public String getUserName() {
        return mUserId;
    }

    public boolean isStarted() {
        return SinchService.this.isStarted();
    }

    public void startClient(String userName) {
        start(userName);
    }

    public void stopClient() {
        stop();
    }

    public void setStartListener(StartFailedListener listener) {
        mListener = listener;
    }

    public Call getCall(String callId) {
        return mSinchClient.getCallClient().getCall(callId);
    }
}

public interface StartFailedListener {
    void onStartFailed(SinchError error);

    void onStarted();
}

private class MySinchClientListener implements SinchClientListener {

    @Override
    public void onClientFailed(SinchClient client, SinchError error) {
        if (mListener != null) {
            mListener.onStartFailed(error);
        }
        mSinchClient.terminate();
        mSinchClient = null;
    }

    @Override
    public void onClientStarted(SinchClient client) {
        Log.d(TAG, "SinchClient started");
        if (mListener != null) {
            mListener.onStarted();
        }
    }

    @Override
    public void onClientStopped(SinchClient client) {
        Log.d(TAG, "SinchClient stopped");
    }

    @Override
    public void onLogMessage(int level, String area, String message) {
        switch (level) {
            case Log.DEBUG:
                Log.d(area, message);
                break;
            case Log.ERROR:
                Log.e(area, message);
                break;
            case Log.INFO:
                Log.i(area, message);
                break;
            case Log.VERBOSE:
                Log.v(area, message);
                break;
            case Log.WARN:
                Log.w(area, message);
                break;
        }
    }

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

private class SinchCallClientListener implements CallClientListener {

    @Override
    public void onIncomingCall(CallClient callClient, Call call) {
        Log.d(TAG, "Incoming call");
        Intent intent = new Intent(SinchService.this, IncomingCallScreenActivity.class);
        intent.putExtra(CALL_ID, call.getCallId());
        intent.putExtra(LOCATION, call.getHeaders().get("location"));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        SinchService.this.startActivity(intent);
       }
   }

}

将我的登录类与教程的登录类进行比较时,唯一的区别是变量&#34; userName&#34;是派生的。我们都有一个附加到用户名的值;但是,只有一个客户端能够建立而另一个客户端抛出NullPointerException错误。谁知道为什么?

编辑:错误消息如下:

   public class LoginActivity extends BaseActivity implements SinchService.StartFailedListener {

private EditText mLoginName, recipientName, coordinateA, coordinateB;
private Button loginButton;
private static final int REQUEST_PERMISSION = 10;
public static final String DEFAULT = "N/A";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    userName = (EditText) findViewById(R.id.userInput);
    recipientName = (EditText) findViewById(R.id.recipientInput);
    loginButton = (Button) findViewById(R.id.loginButton);
    requestAppPermissions(new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.ACCESS_FINE_LOCATION}, R.string.msg,  REQUEST_PERMISSION);

    SharedPreferences sharedPreferences = getSharedPreferences("MyData", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("user_name", mLoginName.getText().toString());
    editor.putString("recipient_name", recipientName.getText().toString());
    editor.commit();

    loginButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            loginClicked();
        }
    });

}

@Override
public void onPermissionGranted(int requestCode) {

}

@Override
protected void onServiceConnected() {
    getSinchServiceInterface().setStartListener(this);
}

@Override
protected void onPause() {
    super.onPause();
}

@Override
public void onStartFailed(SinchError error) {
    Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show();
}

@Override
public void onStarted() {
    openPlaceCallActivity();
}

private void loginClicked() {
    SharedPreferences sharedPreferences = getSharedPreferences("MyData", MODE_PRIVATE);
    String userName = sharedPreferences.getString("user_name", DEFAULT);

     if (userName.isEmpty()) {
        Toast.makeText(this, "Please enter a name", 
        Toast.LENGTH_LONG).show();
        return;
    }  

    if (!getSinchServiceInterface().isStarted()) {
        getSinchServiceInterface().startClient(userName);
    } else {
        openPlaceCallActivity();

    }
}
private void openPlaceCallActivity() {
    Intent mainActivity = new Intent(LoginActivity.this, PlaceCallActivity.class);
    startActivity(mainActivity);
    }

}

SECOND EDIT:在BaseActivity类中找到了getSinchServiceInterface()方法。它如下:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.dejon_000.sinchtest2, PID: 32470
              java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.example.dejon_000.sinchtest2.SinchService$SinchServiceInterface.isStarted()' on a null object reference
                  at com.example.dejon_000.sinchtest2.LoginActivity.loginClicked(LoginActivity.java:83)
                  at com.example.dejon_000.sinchtest2.LoginActivity.access$000(LoginActivity.java:17)
                  at com.example.dejon_000.sinchtest2.LoginActivity$1.onClick(LoginActivity.java:47)
                  at android.view.View.performClick(View.java:4802)
                  at android.view.View$PerformClick.run(View.java:20059)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5422)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707)