2016-03-06 4 views
1

У меня есть два приложения, A и B, которые используют библиотеку C. Android. B имеет службу A, которая хочет использовать через C, например.Как сделать явным намерение явно?

<service android:name="my.package.in.a.service.ConnectorService" 
     android:exported="true"> 
    <intent-filter> 
     <action android:name="my.package.in.a.action.START_A"/> 
    </intent-filter> 
</service> 

В моей библиотеке есть класс, который пытается связать его с сервисом, например.

Intent intent = new Intent("my.package.in.a.service.ConnectorService"); 
    /** establish a connection with the service. */ 
    boolean result = context.bindService(intent, messenger, 
     Context.BIND_AUTO_CREATE); 

По-видимому, вы больше не можете этого делать из-за проблем с безопасностью (подразумеваемые против явных намерений). Я попытался инициализировать намерение, используя действие, определенное в A. Я также попытался добавить имя пакета, а также попытался установить имя класса, например.

Intent intent = new Intent() 
    intent.setPackage("my.package.in.a.service"); 
    intent.setClassName("my.package.in.a.service", 
      "my.package.in.a.service.ConnectorService"); 

Я попытался найти службу, используя диспетчер пакетов, например.

Intent intent = new Intent("my.package.in.a.service.ConnectorService"); 
    List<ResolveInfo> resolveInfoList = context.getPackageManager() 
      .queryIntentServices(intent, Context.BIND_AUTO_CREATE); 

    if (resolveInfoList.isEmpty()) { 
     Log.e(TAG, "could not find any service"); 
    } 

    if (resolveInfoList.size() > 1) { 
     Log.e(TAG, "multiple services found"); 
    } 

Я немного озадачен тем, что я делаю неправильно? Насколько я понял, вы можете сделать неявное намерение явным, даже если оно не является частью одного и того же пакета/приложения, просто указав имя пакета/classname. Однако все это, кажется, терпит неудачу и, очевидно, я делаю что-то неправильно?

ответ

1

Я не думаю, что setPackage() делает «достаточно», чтобы сделать его полностью явным. Для этого вы need setComponent().

Ваш второй подход, используя PackageManager, находится на правильном пути, но если вы просто не усекли свой список кодов, вы пропустили шаг настройки-Intent.

В this sample app из this book, я не только проверить для одной реализации сервиса, но я также проверить свою подпись (чтобы обеспечить приложение я хочу связываться не взломан) и настроить Intent:

Intent implicit=new Intent(IDownload.class.getName()); 
List<ResolveInfo> matches=getActivity().getPackageManager() 
    .queryIntentServices(implicit, 0); 

if (matches.size() == 0) { 
    Toast.makeText(getActivity(), "Cannot find a matching service!", 
    Toast.LENGTH_LONG).show(); 
} 
else if (matches.size() > 1) { 
    Toast.makeText(getActivity(), "Found multiple matching services!", 
    Toast.LENGTH_LONG).show(); 
} 
else { 
    ServiceInfo svcInfo=matches.get(0).serviceInfo; 

    try { 
    String otherHash=SignatureUtils.getSignatureHash(getActivity(), 
     svcInfo.applicationInfo.packageName); 
    String expected=getActivity().getString(R.string.expected_sig_hash); 

    if (expected.equals(otherHash)) { 
     Intent explicit=new Intent(implicit); 
     ComponentName cn=new ComponentName(svcInfo.applicationInfo.packageName, 
     svcInfo.name); 

     explicit.setComponent(cn); 
     appContext.bindService(explicit, this, Context.BIND_AUTO_CREATE); 
    } 
    else { 
     Toast.makeText(getActivity(), "Unexpected signature found!", 
     Toast.LENGTH_LONG).show(); 
    } 
    } 
    catch (Exception e) { 
    Log.e(getClass().getSimpleName(), "Exception trying to get signature hash", e); 
    } 
} 
+0

Я добавил инициализацию в последнем фрагменте кода моего вопроса. однако он все еще терпит неудачу. действительно ли мне нужно определить помощь, как вы? – user1729210

+0

@ user1729210: «Мне действительно нужно определить помощь, как вы?» - если вы пытаетесь установить связь между приложениями, абсолютно. Также обратите внимание, что ваш отредактированный фрагмент кода по-прежнему не вызывает 'setComponent()'. – CommonsWare

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