5

私は Mark Murphy の優れた Commonsware の本を読んでいますが、消化するのは大変です。「FakePlayer」アプリを作成しました (mp3 プレーヤーのふりをします)。サービスが含まれています。学習経験として、クリック ハンドラーが行う簡単なアプリ (ボタンしかない) を作成しようとしました。

Intent i = new Intent();
i.setAction("com.example.cwfakeplayer.MyPlayerService");
Context context = getApplicationContext();
context.startService(i);

正常に動作しました - サービスは正常に開始されました。Eclipse がサービスに対する権限がないことを訴えていることに気付いたので、android:permissions と android:exported の 2 行を追加してサービスのマニフェストを更新しました。

    <service 
        android:name="MyPlayerService"
        android:permission="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION"
        android:exported="true"
       <intent-filter>
            <action android:name="com.example.fakeplayer.MyPlayerService"></action>
       </intent-filter>
      </service>

Eclipseで「デバッグ」を使用して、プレーヤーアプリをデバイス(Galaxy S2を使用しています)にリロードしました。うまくいったようです。スターターアプリが許可例外を引き起こしました。これは予想通りでした。

次に、スターター アプリのマニフェストに追加しました (アクセス許可を与えるため):

<manifest
  ...
  <uses-sdk ....
  ....
  <uses-permission android:name="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION" />

スターター アプリをデバイスにリロードしました (Eclipse でデバッグを使用)。スターターアプリで引き続き許可エラーが発生します。

デバイスから両方のアプリを削除し、(デバッグを使用して) 再インストールしました。最初にサービス アプリ、次にスターターを使用しました。それでもパーマエラーが発生します。

マーフィー氏の高度な Android ブックの「リモート サービスの使用方法」セクションに取り組んでいるので、これはおそらく複数のアプリで作業するための最良の方法ではないことに気付きました。

「adb shell dumpsys package」を実行し、スターター アプリを見つけたところ、「permissionsFixed=false」があり、「grantedPermissions」セクションがないことがわかりました。これは、スターター アプリのマニフェストの変更によって、パーマがアプリに追加されなかったことを意味します。しかし、私には理由がわかりません。学習経験として、これまでのところ混乱しか生じていません....

手がかりは大歓迎です!ありがとう!

4

2 に答える 2

3

android:permissions と android:exported の 2 行を追加して、サービスのマニフェストを更新しました。

を自動的にエクスポートできるようにするため、技術的にandroid:exported="true"は不要です。<intent-filter><service>

デバイスから両方のアプリを削除し、(デバッグを使用して) 再インストールしました。最初にサービス アプリ、次にスターターを使用しました。それでもパーマエラーが発生します。

<permission>要素でカスタム許可を宣言した場所は表示されません。実際には、両方のアプリを制御する場合は<permission>、両方のマニフェストに同じ要素を配置して、2 つのアプリのインストール順序は問題にならないようにします。

于 2013-03-18T11:17:58.390 に答える
-2

マニフェストでこれを置き換えてみてください

<service android:name="com.example.fakeplayer.MyPlayerService"></service>

それ以外の

<service 
    android:name="MyPlayerService"
    android:permission="com.example.fakeplayer.permission.MY_PLAYER_PERMISSION"
    android:exported="true"
   <intent-filter>
        <action android:name="com.example.fakeplayer.MyPlayerService"></action>
   </intent-filter>
  </service>

これでうまくいかない場合は、エラーを投稿してください。

于 2013-03-18T03:08:39.093 に答える