Как мне обработать ошибку: «Не разрешено запускать намерение службы без разрешения», если служба принадлежит другому приложению - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь запустить службу (RUN_SYN C) из моего android приложения, служба принадлежит другому приложению, уже установленному на моем android устройстве, в настоящее время я просто тестирую службу перед использованием. Я также добавил соответствующие разрешения в свой манифест.

Вот код моего приложения:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button syncButton = findViewById(R.id.button_id);
        syncButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName(
                        "org.opendatakit.services",
                        "org.opendatakit.services.sync.service.OdkSyncService"));
                startService(intent);
            }
        });
    }
}

Вот мой AndroidManifest моего приложения. xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="org.opendatakit.webkitserver.RUN_WEBSERVER" />
    <uses-permission android:name="org.opendatakit.database.RUN_DATABASE" />
    <uses-permission android:name="org.opendatakit.sync.RUN_SYNC" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Это декларация сервиса и декларация разрешений в AndroidManifest. xml приложения (ODK-X Services), которое изначально объявляло сервис (пакет - «org.opendatakit.services»>):

<service android:name=".sync.service.OdkSyncService"
    android:exported="true"
    android:process=":sync"
    android:permission="org.opendatakit.sync.RUN_SYNC" >
</service>

<permission android:name="org.opendatakit.sync.RUN_SYNC"
            android:label="@string/sync_launch_permission"
            android:permissionGroup="org.opendatakit.services.permissions"
            android:protectionLevel="signature">
</permission>

Это ошибка:

Process: com.example.myapplication, PID: 1423
    java.lang.SecurityException: Not allowed to start service Intent { cmp=org.opendatakit.services/.sync.service.OdkSyncService } without permission org.opendatakit.sync.RUN_SYNC
        at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1381)
        at android.app.ContextImpl.startService(ContextImpl.java:1358)
        at android.content.ContextWrapper.startService(ContextWrapper.java:613)
        at com.example.myapplication.MainActivity$1.onClick(MainActivity.java:24)
        at android.view.View.performClick(View.java:5648)
        at android.view.View$PerformClick.run(View.java:22442)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6121)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

Я проверил с помощью команды оболочки adb, существуют ли разрешения, которые я пытаюсь использовать, на моем android устройстве - они есть. Мне не разрешено редактировать код второго приложения, но это не имеет значения, поскольку оно экспортирует службу (для экспорта установлено значение true). Я прочитал много сообщений, но ни одно из предложений (копирование всех разрешений второго приложения, упорядочивание разрешений для зависимостей и проверка поддерживаемого SDK, который в моем случае составляет 16, а не 23) не помогло. Мне действительно поможет, если кто-нибудь сможет просмотреть это и указать, в чем я ошибаюсь. Спасибо!

...