2016-11-24 6 views
0

Я давно смотрю на это, но я не могу исправить исключение Null Pointer Exception при попытке получить доступ к ResolveInfo.serviceInfo на нулевом объекте. (Придется сделать явное намерение при запуске службы как API 20)Не удается bindService Android()

Вот интерфейс .aidl:

package com.example.playerclient; 

interface AIDLinterface { 
    void Play_Clip(int id); 
    void Pause_Playback(); 
    void Resume_Playback(); 
    void Stop_Player(); 
} 

Вот соответствующий код клиента (onResume() находится где брошен NPE)

public class PlayerClientMain extends AppCompatActivity 
{ 

    Button button; 
    private AIDLinterface mAIDLinterface; 
    private boolean mIsBound = false; 

    private ServiceConnection mServiceConn = new ServiceConnection() 
    { 

     @Override 
     public void onServiceConnected(ComponentName componentName, IBinder iservice) 
     { 
      Log.v("SERVICE CONNECTED", "SERVICE CONNECTED"); 
      mAIDLinterface = AIDLinterface.Stub.asInterface(iservice); 

      Toast.makeText(getApplicationContext(), "service connected", Toast.LENGTH_SHORT).show(); 

      mIsBound = true; 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName componentName) 
     { 
      Log.v("SERVICE DISCONNECTED", "SERVICE DISCONNECTED"); 
      mAIDLinterface = null; 
      Toast.makeText(getApplicationContext(), "service disconnected", Toast.LENGTH_SHORT).show(); 
      mIsBound = false; 

     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_player_client_main); 
     button = (Button) findViewById(R.id.button); 
    } 


    @Override 
    protected void onResume() 
    { 
     super.onResume(); 

     if (!mIsBound) 
     { 
      boolean b = false; 
      Intent i = new Intent(AIDLinterface.class.getName()); 

      ResolveInfo info = getPackageManager().resolveService(i, Context.BIND_AUTO_CREATE); //this is always null 
      i.setComponent(new ComponentName(info.serviceInfo.packageName, info.serviceInfo.name)); //NPE because info is null 

      b = bindService(i, this.mServiceConn, Context.BIND_AUTO_CREATE); 

      if (b) 
       Log.i("SUCCESS:", "bindService() success!"); 
      else 
       Log.i("FAILURE:", "bindService() failed!"); 
     } 
    } 
} 

Код услуги не имеет отношения к делу, так как я не могу дотянуться до линии bindService(). Есть идеи?

ответ

0

Я думаю, что проблема заключается в создании самого намерения.

Предположим AIDLinterface.class класс обслуживания, вы должны создать намерение, как это:

Intent i = new Intent(this, AIDLinterface.class); 

Для получения дополнительной информации см https://developer.android.com/guide/components/services.html

Приветствия ~

+0

AIDLinterface не класс обслуживания. Интерфейс позволяет удаленному сервису связываться с моим локальным клиентом (PlayerClient). – user3487243

+0

Спасибо за ответ, но это не помогло. Я больше не получаю NPE, но bindService() возвращает false – user3487243

Смежные вопросы