2011-12-09 3 views
1

任意のアプリケーションを可能にする。しかし、私の問題ではなく、任意のない私は自分のパッケージ名を有効にしたいということで、他のアプリケーションパッケージ名。アンドロイドPackageManagerは、私たちが持っているすべてのアプリケーションを手動で</p> <p>をインストールすることができることを有効にしたアプリケーションを開発している

ここに私が使用したコードがあります。

ここ
try { 
    PackageManager pm1 = getPackageManager(); 

    pm1.setComponentEnabledSetting(new ComponentName("com.service", 
    "com.service.EnableActivity"), 
    PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
     PackageManager.DONT_KILL_APP 
    ); 
} catch (SecurityException e) { 
    e.printStackTrace(); 
} 

「com.serviceは、」私は、インストールパッケージの名前で、「com.service.EnableActivityは、」私の最初のアプリlauncherActivityです。

ログイン

java.lang.SecurityException: Permission Denial: attempt to change component state from pid=3354, uid=10056, package uid=10058 at 
android.os.Parcel.readException(Parcel.java:1322) at 
android.os.Parcel.readException(Parcel.java:1276) at 
android.content.pm.IPackageManager$Stub$Proxy.setComponentEnabledSettingIPackageManager.java:2217) 

しかし、私は同じアプリケーションのパッケージ名とクラス名を使用する場合、それは正常に動作しています。これは「signatureOrSystem」である(そしてそれはシステム内で宣言されている)ので、それが唯一のシステムで署名されているアプリケーションで使用できることを

<!-- Allows an application to change whether an application component (other than its own) is 
    enabled or not. --> 
<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" 
    android:label="@string/permlab_changeComponentState" 
    android:description="@string/permdesc_changeComponentState" 
    android:protectionLevel="signatureOrSystem" /> 

注:私は、以下を参照してくださいプラットフォームを見てみると

答えて

0

つまり、Androidベンダー(HTC、Samsung、Motorolaなど)である必要があります。詳細はこれを参照してください。

http://developer.android.com/guide/topics/manifest/permission-element.html

UPDATE:あなたがする必要があり、その後、独自のコンポーネントやアプリケーションの有効状態を変更しようとしている場合

ガージンダー・シンPablaは、正しい答えを持っていますそれらがAndroidManifestで設定されているのと同じユーザーIDを持っていることを確認してください。別のユーザーIDを持つ他のパッケージを無効にする場合は、ベンダーになる必要があります。あなたは、PackageManagerService.javaのAndroidソースのチェックを見ることができます:

final int uid = Binder.getCallingUid(); 
final int permission = mContext.checkCallingPermission(
      android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); 
final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); 

// ... 

if (!allowedByPermission && (uid != pkgSetting.userId)) { 
    throw new SecurityException(
     "Permission Denial: attempt to change component state from pid=" 
     + Binder.getCallingPid() 
     + ", uid=" + uid + ", package uid=" + pkgSetting.userId); 
} 
+1

"これは" signatureOrSystem "なので、システム署名で署名されたアプリでのみ使用できます。"本当ですか?あなたが掲示したリンクを読む –

+1

システムで宣言されているので、この特定の権限はシステムまたはシステムキーで署名されたパッケージでのみ利用可能であるため、答えを更新しました。 – satur9nine

+0

True - それを追加するとエラーになります.-まあ、質問に答えることはできません.--あなたがベンダーでなければならないなら、それは何ですか? _他のapps_コンポーネント有効状態のいずれかを変更する方法はありませんか? –

5

あなたの両方のアプリケーションmainfestでこのコードを追加してください。

<manifest 
    ....... 
    ....... 
    ....... 
    android:sharedUserLable="...." 
    android:sharedUserID="..."> 

それはこれがお手伝いします

同じになるようにユーザーIDを必要とするので。

+0

から変更しようとします。私は他のアプリケーションを自分のアプリケーションで無効にしたいが、それは私にクラッシュを与える。パーミッション拒否:コンポーネントの状態をpid = 30188、uid = 10472、package uid = 10091から変更しようとします。 –

関連する問題

 関連する問題