web-dev-qa-db-ja.com

Android Wearアプリが携帯電話からインストールされない

Androidハンドセットの「Android Studioメソッド付きのパッケージ)が見つかりました here apkがウェアラブルデバイスにインストールされることはありません。これはlogcatの出力です。

07-28 15:11:54.107      766-820/? W/PackageManager﹕ Unknown permission com.google.Android.wearable.READ_SETTINGS in package com.google.Android.gms
07-28 15:11:54.117      766-820/? W/PackageManager﹕ Not granting permission com.google.Android.gm.permission.AUTO_SEND to package com.google.Android.wearable.app (protectionLevel=2 flags=0x88be44)
07-28 15:11:54.117      766-820/? W/PackageManager﹕ Not granting permission Android.permission.MEDIA_CONTENT_CONTROL to package com.google.Android.wearable.app (protectionLevel=18 flags=0x88be44)
07-28 15:11:55.047      632-632/? D/WearablePkgInstaller﹕ Got PackageUpdateReceiver message Intent { act=Android.intent.action.PACKAGE_REMOVED dat=package:my.package.name flg=0x4000010 cmp=com.google.Android.wearable.app/com.google.Android.clockwork.companion.packagemanager.PackageUpdateReceiver (has extras) }
07-28 15:11:55.177      632-632/? D/WearablePkgInstaller﹕ Got PackageUpdateReceiver message Intent { act=Android.intent.action.PACKAGE_ADDED dat=package:my.package.name flg=0x4000010 cmp=com.google.Android.wearable.app/com.google.Android.clockwork.companion.packagemanager.PackageUpdateReceiver (has extras) }

補足として、手動でパッケージ化することもでき(上記のリンクにも記載されています)、APKをハンドセットで実行すると、ウェアラブルデバイスにインストールされます。私はbuildToolsVersion 20.0.0を使用していますが、Android Studio 0.8.2を実行しており、ハンドセットモジュールのbuild.gradleに次の行があります。

wearApp project(':wearable')

これをデバッグする方法のアイデアが足りなくなりました。ログはかなり役に立たないようです。何か案は?

編集:ハンドセットとウェアラブルモジュールの両方のマニフェストとbuild.gradleの関連セクションを投稿します。

ハンドセットマニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="my.package.name"
          Android:installLocation="auto"
          Android:versionCode="259"
          Android:versionName="4.6.1">

    <!-- =========== -->
    <!-- PERMISSIONS -->
    <!-- =========== -->

    <permission
        Android:name="my.app.name.permission.C2D_MESSAGE"
        Android:protectionLevel="signature"/>

    <uses-permission Android:name="Android.permission.INTERNET"/>
    <uses-permission Android:name="Android.permission.WAKE_LOCK"/>
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"/>

    <!-- ====================== -->
    <!-- APPLICATION PROPERTIES -->
    <!-- ====================== -->

    <uses-sdk
        Android:minSdkVersion="9"
        Android:targetSdkVersion="19" />

    <supports-screens
        Android:anyDensity="true"
        Android:largeScreens="true"
        Android:normalScreens="true"
        Android:smallScreens="true"
        Android:xlargeScreens="true"/>

    <application
        Android:name=".AppState"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/Theme.MyApp"
        Android:hardwareAccelerated="true">


        <!-- ==================== -->
        <!-- GOOGLE PLAY SERVICES -->
        <!-- ==================== -->

        <meta-data
            Android:name="com.google.Android.gms.version"
            Android:value="@integer/google_play_services_version"/>

        <!-- ================== -->
        <!-- Android Wear -->
        <!-- ================== -->

        <service
            Android:name=".wear.DataLayerListenerService" >
            <intent-filter>
                <action Android:name="com.google.Android.gms.wearable.BIND_LISTENER" />
            </intent-filter>
        </service>

        <!-- This is used for manual packaging I have this commented out when -->
        <!-- packaging with Android Studio-->
        <!--<meta-data Android:name="com.google.Android.wearable.beta.app"-->
                <!--Android:resource="@xml/wearable_app_desc"/>-->

        ...The rest of the activities

    </application>

</manifest>

ハンドセットbuild.gradle

buildscript {
    repositories {
        maven { url 'http://download.crashlytics.com/maven' }
    }

    dependencies {
    }
}

apply plugin: 'com.Android.application'
apply plugin: 'crashlytics'
apply plugin: 'newrelic'

repositories {
    mavenCentral()
    maven { url 'http://download.crashlytics.com/maven' }
}

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile 'com.Android.support:support-v4:20.0.+'
    compile 'com.Android.support:appcompat-v7:20.0.+'
    compile project(':facebook')
    compile project(':mopub-sdk')
    compile project(':GooglePlay')
    compile 'com.newrelic.agent.Android:android-agent:3.+'
    compile 'com.crashlytics.Android:crashlytics:1.+'
    androidTestCompile fileTree(dir: 'tests/libs', include: '*.jar')
    wearApp project(':wearable')
}

Android {
    compileSdkVersion 19
    buildToolsVersion '20.0.0'

    //Build type is debug to avoid conflict with Proguard
    testBuildType = "debug"

    defaultConfig {
        testApplicationId "my.package.name.test"
        testInstrumentationRunner "com.zutubi.Android.junitreport.JUnitReportTestRunner"
    }

    lintOptions {
        // We do not want to abort the build due to lint errors
        abortOnError false
    }

    sourceSets {
        // Main is the default unless stated otherwise
        main {
            manifest.srcFile 'AndroidManifest.xml'
            Java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
        // Testing
        androidTest.setRoot('tests')
        androidTest {
            Java.srcDirs = ['tests/src']
            res.srcDirs = ['tests/res']
        }
        // Cannot add beta icons in here because custom flavour source sets are created
        // during compilation and name duplication will result in a crash
    }

    signingConfigs {
        debug {
            storeFile file("**")
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
        }
        release {
            storeFile file("***")
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
        }
    }

    buildTypes {
        // Development configuration
        debug {
            debuggable true
            jniDebugBuild true
            signingConfig signingConfigs.debug
            runProguard false
        }

        // Release configuration
        release {
            debuggable false
            jniDebugBuild false
            signingConfig signingConfigs.release

              // COMMENTED PROGUARD OUT FOR NOW TO SEE IF IT WILL HELP
//            // Configure ProGuard
//            runProguard true
//            // General configuration
//            proguardFile 'proguard/proguard.cfg'
//            // Add all of our component-specific configurations (excluding the Android generic, as we want it to be last)
//            FileTree tree =  fileTree(dir: 'proguard', include: '*.txt', exclude: 'Android.txt')
//            tree.each {File file ->
//                proguardFile file.getCanonicalPath()
//            }
//            // Add a fallback configuration for all Android apps
//            proguardFile 'proguard/Android.txt'
        }

        // Release configuration, but debuggable and without ProGuard
        // Used for testing features like G+ and in-app billing where a release config is required
        staging {
            debuggable true
            jniDebugBuild true
            signingConfig signingConfigs.release
            runProguard false
        }
    }

    productFlavors {
        production {
            applicationId "my.package.name"
        }
        internalBeta {
            applicationId "my.internalbetapackage.name"
            // Beta icons
            sourceSets.internalBeta.res.srcDirs = ['res-beta/internal']
        }
        externalBeta {
            applicationId "my.externalbetapackage.name"
            // Beta icons
            sourceSets.externalBeta.res.srcDirs = ['res-beta/external']
        }
        testing{
            applicationId "my.package.name"
        }
    }

    // Without this, gradle will complain that duplicate files were added to the APK, see:
    // http://stackoverflow.com/questions/20673888/duplicate-files-copied-Android-studio-0-4-0
    packagingOptions {
        exclude 'META-INF/LICENSE.txt' // Twitter4j
        exclude 'META-INF/ASL2.0'      // jackson
        exclude 'META-INF/LICENSE'     // jackson
        exclude 'META-INF/NOTICE'      // jackson
    }

}

task makeTestApks {
    dependsOn "assembleProductionRelease"
    dependsOn "assembleProductionTest"
}

ウェアラブルマニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="my.package.name">

    <uses-feature Android:name="Android.hardware.type.watch" Android:required="false"/>

    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@Android:style/Theme.DeviceDefault" >
        <meta-data
            Android:name="com.google.Android.gms.version"
            Android:value="@integer/google_play_services_version" />

        <activity
            Android:name=".WearReaderActivity"
            Android:label="MyApp" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action Android:name="my.package.name.READ"/>
                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            Android:name=".wear.DataLayerListenerService" >
            <intent-filter>
                <action Android:name="com.google.Android.gms.wearable.BIND_LISTENER" />
            </intent-filter>
        </service>
    </application>

</manifest>

ウェアラブルbuild.gradle

repositories {
    mavenCentral()
}

apply plugin: 'com.Android.application'
apply plugin: 'newrelic'

Android {
    compileSdkVersion 19
    buildToolsVersion '20.0.0'
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19
        versionCode 259
        versionName "4.6.1"
    }

    signingConfigs {
        debug {
            keyAlias '***'
            keyPassword '***'
            storeFile file('sameAsHandset/debug.keystore')
            storePassword '***'
        }
        release {
            storeFile file("sameAsHandset/Android.keystore")
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
        }
    }

    buildTypes {
        release {
            debuggable true
            jniDebugBuild false
            signingConfig signingConfigs.release
        }
    }

    productFlavors {
        production {
            applicationId "my.package.name"
        }
        internalBeta {
            applicationId "my.internalBetaPackage.name"
            // Beta icons
            sourceSets.internalBeta.res.srcDirs = ['res-beta/internal']
        }
        externalBeta {
            applicationId "my.externalBetaPackage.name"
            // Beta icons
            sourceSets.externalBeta.res.srcDirs = ['res-beta/external']
        }
        testing{
            applicationId "my.package.name"
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':GooglePlay')
    compile 'com.newrelic.agent.Android:android-agent:3.+'
}
20
odiggity

@odiggityに具体的に回答するには、電話アプリのbuild.gradleファイルで、 Wearアプリの正確な名前を言及する必要がありますフォルダ Android Studio でプロジェクトを作成した場合、build.gradleは次のようになります。

                      wearApp project(':wear')

これは、次の理由で発生する可能性があります。

  • ウェア&モバイルアプリの"permissions"は同じではありません(Wearアプリの権限はモバイルアプリの権限のサブセットである必要があります)。

これは開発者のWebサイトのどこにも文書化されていませんが、個人的な経験でこれを見つけました。この制限の背後で私が考えることができる理由は、Googleが卑劣な開発者がユーザーとそのプライバシーを悪用することを防止したいということです。

  • Package nameのWearアプリとモバイルアプリが一致していません。
  • VersionNumberVersionNameのWearアプリとモバイルアプリの両方が一致しません
  • Application ID(build.gradleファイル)のMobile&Wearアプリが一致しません。
  • デフォルトでは、ウェアラブルパッケージはreleaseビルドにのみ含まれています
  • 両方のアプリは同じキーでsignedである必要があります
  • Android Studio 3.0 APKビルドの実行時に作成されたビルドはtest only builds着用時のインストールを許可していません(returnCode -15、 この情報 を参照)
  • 資産圧縮

開発にEclipseを使用している場合は、必ず "Asset Compression"をオフにしてください。オフにしないと、rawフォルダーの ".apk"ファイルがdouble compressedphone won't be able to recognizeモバイルアプリがウェアアプリをパッケージ化しているかどうか。

最適なソリューション:

Use Android Studio.

  1. 作成Androidプロジェクト
  2. Phone&Wearプロジェクトを選択
  3. プロジェクト作成の手順に従います
  4. Wearアプリで使用されているすべての権限をモバイルアプリのマニフェストにコピーする、またはその逆

デバッグ

ウェアラブルでWearアプリが見つからない場合は、常に両方のデバイスのログを調べて、何が起こっているかを確認できます。 WearablePkgInstallerでフィルタリングして、ウェアラブルパッケージのインストールに関連するすべてのログを見つけることができます。

デバイスのWear OSアプリで、[詳細設定]の[アプリの再同期]オプションをトリガーし、ログを確認します。アプリのウェアラブルのみを同期する別の方法は、アプリを再インストールすることです。その時点で、ウェアラブルもパッケージと同期されます。

デバイスのログには次のように表示されます。

11-07 14:58:53.127 3330-8739/? I/WearablePkgInstaller: Setting DataItem to install wearable apps for com.spotify.music

アプリIDはcom.spotify.musicです。これはSpotifyの単なる例です。

時計(ブルートゥースまたはUSB経由のデバッグ)では、この同じフィルターを使用してログに記録され、問題または成功を示しています。

11-07 15:00:02.533 1032-1048/? I/WearablePkgInstaller: Package com.spotify.music was installed.

ほとんどのエラーメッセージは自明です。これらのエラーの多くの例は WearPackageInstallerServiceクラスのソースコード にあります。ただし、一部は単なるreturnCodeです。これらの戻りコードについては、 このPackageManagerソースコード の値を確認してください。

24
Umer Farooq

ウェア製品のフレーバーで問題を解決しました。ハンドヘルドアプリとウェアアプリの両方に味がありました。私の問題を解決するために、build.gradleハンドヘルドアプリファイルの次のコードを使用しました。

freeWearApp project(path: ':wear', configuration: 'wearfreeRelease')
fullWearApp project(path: ':wear', configuration: 'wearfullRelease')

ここで、freeおよびfullは、ハンドヘルドモジュールからのフレーバー、wearfreeおよびwearfullは、wear muduleのフレーバーですReleaseはウェアモジュールビルドタイプの名前です。

そしてお忘れなくpublishNonDefault true =Android Wear Gradleのブロック。

5
PavelGP

パッケージ名、アプリケーションIDを確認し、wearモジュールにハンドヘルドモジュールが持っていた権限がないことを確認した後でも、この問題がありました。

私の問題は、私が許可を要求していたことでしたAndroid.permission.BIND_NOTIFICATION_LISTENER_SERVICEウェアラブルモジュールのAndroidManifest.xml。これは、ハンドヘルドモジュールに対してのみ要求されるようです。

4
Denley Bihari

私の経験では、署名付きリリースビルドをビルドする場合にのみ機能します。デバッグビルドをデプロイするときに、wearアプリをインストールしませんでした。署名付きリリースでは、buildToolsVersion "19.1.0"で動作しました。

この特定のケースでは、「compile project( ':GooglePlay')」を使用していることがわかります。それは最新バージョンですか? (「com.google.Android.gms:play-services-wearable:+」をコンパイルしてください)

2
Heinrisch

現在のところ、製品フレーバーがサポートされていない限り、手動ビルド(assetまたはraw)を使用するか、製品フレーバーを削除してください。

2
Demoritas

多くの回答で見たことのないものを追加したかっただけです。

ハンドヘルドアプリとWearアプリのapplicationIdを一致させる必要があります。

以前は<uses-feature Android:name="Android.hardware.type.watch" />ハンドヘルドとウォッチマニフェストの両方で、次のように追加します:Android:required="true"はウェアラブルマニフェスト、Android:required="false"デバイス用。

これはIS FALSEです。ハンドヘルドマニフェストでは上記は必要ありません。実際に、Wear 2.0が登場すると、23未満のminSdkでapkをアップロードできないようにする変更がGoogleで行われました。もし<uses-feature Android:name="Android.hardware.type.watch" />がハンドヘルドアプリにあります。混乱してすみません。

1
CJ Barnwell

私は最近この問題を抱えていて、結局次のように修正しました。

  • 以前のアプリをアンインストール
  • 電話を再起動
  • 摩耗を再開
  • Wearを切断して再接続する
  • Android Wearアプリケーションでアプリを再同期する

そしてそれが時計に現れた。これの前に私はすべてを試してみて、ビルドが正しく機能していないと確信しました

1

同じ問題が発生し、newrelicがAndroid Wear Appを実装していることがわかりました。次の行にコメントしてみてください。

Wearアプリから離れるようにnewrelicに指示する方法が見つかりませんでした...

0
Jose Parente