0

私は2つの別々のアプリケーションを持っています。appA のコード内で appB がデータベースにアクセスできるようにしたいと考えています。この場合、コンテンツ プロバイダーを使用したくありません。

これに関する SO の投稿を読み、指示に従いました ( 2 つの Android アプリ間で SQLite データベースを共有しますか? )。

私がやった事:

AppA の Android マニフェスト:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.micode.primaryapplication">

    <application
        android:sharedUserId="com.micode.sharedid"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        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>

AppB の Android マニフェスト:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.micode.secondaryapplication">

    <application
        android:sharedUserId="com.micode.sharedid"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        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>

AppA はデータベースを作成し、AppB はデータベースにアクセスする必要があります。

次のコードは AppB で使用されます。

package com.micode.secondaryapplication;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    Button btnExit;
    TextView txtViewDisplay;
    Context sharedContext;

    SQLiteDatabase db = null;
    private static String DBNAME = "Contacts.db";

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

        setupContext();
    }

    private void setupContext()
    {
        try {
            sharedContext = this.createPackageContext("com.micode.primaryapplication", Context.CONTEXT_INCLUDE_CODE);
            if (sharedContext == null) {
                return;
            }
        } catch (Exception e) {
            String error = e.getMessage();
            System.out.println(error);
            return;
        }
    }

まったく同じ署名キーを使用して両方のアプリケーションをビルドしようとしました。つまり、署名付き APK をビルド/生成し、インストール前に以前のインスタンスをアンインストールしました。

また、これをデバッグ モードで実行しようとしています。つまり、AppA をデバッグ モードでインストールしてから、AppB をデバッグ モードでインストールします。

後者の場合、次のエラーが表示されます。

com.micode.primaryapplication (uid 10226) からのコードをプロセス com.micode.secondaryapplication (uid 10227) で実行するように要求する

このエラーは、次の行を実行するとヒットします。

this.createPackageContext("com.micode.primaryapplication", Context.CONTEXT_INCLUDE_CODE);

問題はインストールにあると思われます。つまり、shareduserid が無視されたため、2 つのアプリケーションが同じ UID を共有しておらず、一意の UID を持っているように思えます。

明確にするために、これらの共有ユーザー ID を使用しているアプリケーションは 2 つしかありません。

どんな助けでも大歓迎です...

4

1 に答える 1

6

まず、この手法はあまりお勧めしませんsharedUserId主にプリインストールされたアプリ用です。特に、アプリを公開すると、sharedUserId(以前にアプリを持っていなかったアプリを定義することを含めて) を変更することはできません。を変更sharedUserIdし、ユーザーが古いものから新しいものにアップグレードすると、古いsharedUserIdが所有しているため、アプリはアプリ自体のファイルにアクセスできなくなりますsharedUserId

そうは言っても、ではなくandroid:sharedUserIdの属性です<manifest><application>

于 2016-04-20T13:12:32.850 に答える