13

Google Play のアプリに問題があります。カスタム許可を利用する無料アプリがあります。この権限により、有料アプリへのアクセスが許可されます。これらの有料アプリは「キー」として機能し、無料アプリの機能のロックを解除します。基本的に、無料アプリはいずれかの有料アプリのインテントを開始しようとします。有料アプリはいくつかのことを行い、無料アプリが機能のロックを解除する必要があるかどうかを返します。

アプリのインストール順序によって問題が発生します。無料アプリが最初にインストールされ、次に有料アプリがインストールされた場合、無料アプリはインテントを開始できません。許可拒否を返します。有料アプリを先にインストールしてから無料アプリをインストールした場合、無料アプリは問題なくインテントを開始できます。デバイスを再起動したり、アプリを強制停止したりしても、問題は解決しません。関連コードを添付しています。私が何か間違ったことをしていると何かが教えてくれます。

  • 無料アプリ マニフェスト (関連コード):

    ...
    <uses-permission android:name="com.company.license.PERMISSION" />
    ...
    
  • 意図を確認するための無料アプリ コード (関連コード):

    Intent KeyApp = new Intent("com.company.license.action.AUTH_1");
    KeyApp.putExtra("com.company.license.challenge", 1);
    
    //If free app is installed first, an exception is thrown for not having the proper permission. If paid app is installed first, no exception is thrown
    try {
        startActivityForResult(KeyApp, COMMING_FROM_KEYAPP);
    } catch (Exception e) {
        cancelStartUp();
    }
    
  • 有料アプリ マニフェスト (関連コード):

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.company.installer.1"
    ...
    <permission
        android:name="com.company.license.PERMISSION"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:protectionLevel="normal" >
    </permission>
    
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoDisplay" >
    
        <activity
            android:name="com.company.license.auth"
            android:configChanges="keyboardHidden|orientation"
            android:exported="true"
            android:permission="com.company.license.PERMISSION"
            android:theme="@style/Theme.Transparent" >
            <intent-filter>
                <action android:name="com.company.license.action.AUTH_1" />
    
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    
        <activity
            android:name="com.company.installer.redirect"
            android:configChanges="keyboardHidden|orientation"
            android:exported="true"
            android:theme="@style/Theme.Transparent" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    </manifest>
    
4

2 に答える 2

12

<permission>両方のアプリに同じ要素を配置します。また、これは 2 つのアプリに固有のものであるため、android:protectionLevel="signature"代わりにnormal-- を使用します。これは、ユーザーがアクセス許可を承認する必要がなく、他の誰もアクセス許可を要求できないことを意味します。また、このレシピでは、どちらの順序でもインストールできます。

更新: ただし、カスタム アクセス許可を使用すると、Android の「最初に勝つ」アプローチにより、潜在的な脆弱性が生じることに注意してください。

更新 #2 : Android 5.0 以降、これはサポートされなくなりまし<permission>た。同じ署名キーで署名されていない限り、2 つのアプリが同じ要素を持つことはできないためです。

于 2012-07-30T21:46:01.627 に答える