1

ライブラリであるプロジェクト#1があります。

たとえば、GCM (C2DM) メッセージで動作し、my_package.permission.C2D_MESSAGEそれ自体のマニフェスト ファイル内に権限 (およびその他) があります。

プロジェクト #1 (lib) をプロジェクト #2 (いくつかのアプリ) に接続します。

質問: プロジェクト #1 からプロジェクト #2 の権限を自動的にアクティブ化することは可能ですか?

4

2 に答える 2

2

私はこれを AndroidStudio と mainfestmerging で動作するようにしました。ライブラリ プロジェクトで、GCM 権限、ブロードキャスト レシーバー、およびインテント レシーバーをすべて持っています。ライブラリ内のインテント サービスが、アプリ内のインテント サービスを呼び出します。私の場合、アプリはこのサービス名をライブラリに登録し、データベースに保存するため、ライブラリ インテント サービスはアプリケーションに使用するインテントを認識します。アプリケーションのどこにも GCM コードやアクセス許可がありません。ここに私のライブラリマニフェストがあります

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.plasync.client.android"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Needed for devices with 4.02 or earlier android -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission android:name="org.plasync.client.android.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="org.plasync.client.android.permission.C2D_MESSAGE" />
   <!-- <uses-permission android:name="com.playsnc.client.android.data.permission.READ_WRITE"/>-->

    <application android:label="" android:icon="@drawable/ic_launcher">
        <!-- This is the signin activity for plAsync -->
        <activity android:name="org.plasync.client.android.AsyncMultiplayerSetupActivity"
                  android:label="@string/SETUP_ACTIVITY_NAME"
                  android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">

            <!-- This is the intent for getting the local user.  Apps that use plAsync must use this
                 intent to retrieve the local user, or allow the user to signin.  Apps should
                 use startActivityForResult as the sigin activity may require user interaction -->
            <intent-filter>
                <action android:name="@string/SETUP_ASYNC_MULTIPLAYER_SESSION_ACTION"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <receiver android:name="org.plasync.client.android.gcm.GcmBroadcastReceiver"
                  android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            </intent-filter>
        </receiver>

        <service android:name="org.plasync.client.android.gcm.GcmReceiveIntentLauncher"/>
    </application>
</manifest>

ここに私のアプリケーションマニフェストがあります

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.plasync.client.android.testapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name="org.plasync.client.android.testapp.AsyncMultiplayerTestAppActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".search.FriendSearchActivity"
                  android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data android:name="android.app.searchable"
                android:resource="@xml/searchable"/>
        </activity>

        <service android:name=".AsyncMultiplayerTestAppMessageReceiver"/>
    </application>

</manifest>

CommonsWare が指摘しているように、パッケージには注意が必要です。BroadcastReceiver のコードが示すように、インテント サービス (ライブラリまたはアプリ) の ComponentName のパッケージは、常にアプリケーション パッケージです。

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName receiveIntentLauncherComponent =
                new ComponentName(context.getPackageName(),
                                  GcmReceiveIntentLauncher.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(receiveIntentLauncherComponent)));
        setResultCode(Activity.RESULT_OK);
    }
}

また、Google BroadcastReceiver は使用できないことに注意してください。上記のように独自に定義する必要があります。原則として、ブロードキャスト レシーバーからアプリ インテントを起動することもできますが、データベースからアプリ インテント名を取得するため、ブロードキャスト レシーバーでそのような操作を行うことはお勧めできません。

それが役立つことを願っています。

于 2013-10-16T18:04:41.147 に答える
2

現在ではありません。「ライブラリ」が「Android ライブラリ プロジェクト」を意味する場合、これは将来可能になる可能性があります。

ただし、特定のケースでは、それはおそらく機能しません。GCM フレームワーク クラスの一部は、GCM を使用するコードが Android ライブラリ プロジェクトにあるかどうかに関係なく、アプリケーションのパッケージを使用します。

于 2012-09-25T22:38:01.293 に答える