12

天気を取得する Android サービスを作成します。AndroidManifest.xml は次のとおりです。

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

    <uses-sdk android:minSdkVersion="15" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:name=".WeatherService"
            android:exported="true" >
        </service>
    </application>

</manifest>

ここで、別の apk にこのサービスを開始させたい:

Intent service = new Intent();
service.setClassName("com.my.weather", "com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);

そして、私はエラーメッセージを受け取りました:

E/AndroidRuntime(14068): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.test/com.my.test.MainActivity}: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=com.my.weather/.WeatherService }

この問題を解決するにはどうすればよいですか?

他の apk は、Messenger メソッドを使用して気象サービスと通信します。

================================================== ==============================

皆さんありがとう!

次に、気象サービスの AndroidManifest.xml を変更します。

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

    <uses-sdk android:minSdkVersion="15" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:name=".WeatherService"
            android:exported="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.my.weather.WeatherService"></action>
            </intent-filter>
        </service>
    </application>

</manifest>

そして、この方法を使用して開始します。

Intent service = new Intent("com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);

次に、警告メッセージを受け取りました:

W/ActivityManager(131): Unable to start service Intent { act=com.my.weather.WeatherService }: not found
4

6 に答える 6

12

私も同じ問題を抱えていました。私にとっての問題は、最初に API を使用してアプリをインストールし、次に API を提供するアプリをインストールしたことでした。最初のアプリをアンインストール/再インストールすると問題が解決しました。

更新: この問題を回避するには、両方のアプリでマニフェストにアクセス許可を定義する必要があります。

于 2013-01-07T17:42:17.563 に答える
7

ここでは、ドキュメントから次のように述べています。

このサービスを (標準の .apk ではなく) リモート プロセスで実行する場合android:processは、マニフェスト タグで次のように指定します。

<service android:name=".app.MessengerService"
        android:process=":remote" />

また、remoteここで選択した名前は任意であり、追加のプロセスが必要な場合は他の名前を使用できることに注意してください。プレフィックスは、名前をパッケージの:標準プロセス名に追加します。これが完了すると、クライアントはサービスにバインドしてメッセージを送信できるようになります。これにより、クライアントはそれに登録してメッセージを受け取ることもできることに注意してください。

Edit1 :
次に、サービス要素 (マニフェスト内) にアクション文字列が含まれている場合は、それを使用します。たとえば、サービスが次のように宣言されている場合:

<service android:name="com.sample.service.serviceClass"  
            android:exported="true" android:label="@string/app_name" 
            android:process=":remote">
   <intent-filter><action android:name="com.sample.service.serviceClass"></action>
   </intent-filter>
</service>         

したがってonCreate()、サービスのメソッドでこれを行います:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}

この質問でそれを見ました:
サービスインテントを開始できません

Edit2 :
私はあなたのマニフェストをもう一度見Main/Launcher Activityましandroid 3.1 and laterた。これはメイン/ランチャー アクティビティに必要です。そのため、そのようなアクティビティをアプリに追加し、既に実行されていることに注意する必要があります。In fact forsecurityreason all services,receivers,... that you declare in manifest,will not register unless your App run explicitly by user

于 2012-08-17T14:51:19.547 に答える
2

アクションを含むインテント フィルターを WeatherService に追加します。

<service
    android:name=".WeatherService"
    android:exported="true" >
    <intent-filter>
        <action android:name="this.is.my.custom.ACTION" />
    </intent-filter>
</service>

次に、他のアプリで bindService() を使用してバインドするときは、次のインテントを使用します。

new Intent("this.is.my.custom.ACTION")
于 2012-08-17T15:12:26.423 に答える