我如何处理错误:服务属于另一个应用程序时,“未经允许就不允许启动服务意图”

时间:2020-06-17 20:40:16

标签: android android-intent android-service android-permissions

我正在尝试从我的android应用程序运行服务(RUN_SYNC),该服务属于我的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>

这是最初声明服务的应用程序(ODK-X服务)的AndroidManifest.xml中的服务声明和权限声明(程序包为“ 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 shell命令检查了我要使用的权限是否存在于我的android设备中-它们确实存在。我不允许编辑第二个应用程序的代码,但这无关紧要,因为它可以导出服务(export设置为true)。我读了很多帖子,但没有任何建议(复制第二个应用程序的所有权限,对依赖项排序权限并检查受支持的sdk(在我的情况下为16,而不是23))没有帮助。如果有人可以仔细查看并指出我要去哪里,那将对我有很大帮助。谢谢!

0 个答案:

没有答案