Android Wear app ne s'installe pas par le combiné

j'essaie de faire installer une application portable via un combiné Android en utilisant la méthode "Package with Android Studio" trouvée ici mais ça ne fonctionne pas. L'apk n'est jamais installé sur le dispositif portable. C'est le logcat de sortie:

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) }

comme note de côté, je suis capable de empaqueter manuellement (également décrit dans le lien ci-dessus) et l'apk est installé sur le dispositif portable lorsque je l'exécute sur le combiné. J'utilise buildToolsVersion 20.0.0, J'exécute Android Studio 0.8.2 et avoir cette ligne dans la construction du module de mon combiné.gradle:

wearApp project(':wearable')

je suis à court d'idées sur la façon de débogage, les journaux semblent assez inutile. Des idées?

EDIT: Allez poster les articles pertinents de Manifester et construire.Grad pour le combiné et le module portable.

Manifeste Du Combiné

<?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>

fabrication du combiné.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"
}

Portable Manifeste

<?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>

construction portable.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.+'
}
19
demandé sur odiggity 2014-07-29 01:19:23

8 réponses

pour Répondre À @odiggity plus précisément, dans l' construire.gradle fichier de votre application téléphonique, vous devriez mentionner le nom exact du dossier de l'application d'usure. Si vous avez créé le projet Android Studio, puis votre.gradle devrait ressembler à ceci:

                      wearApp project(':wear')

Cela peut se produire pour les raisons suivantes:

  • d'Usure Et d'application Mobile "permissions" ne sont pas les mêmes.

ceci n'est documenté nulle part sur developers website, cependant j'ai trouvé cela avec mon expérience personnelle. La raison pour laquelle je peux penser à derrière cette restriction est, Google veulent prévenir sournois développeurs pour exploiter les utilisateurs et leur vie privée.

  • Application ID (construire.gradle file) de Mobile & wear app ne correspondent pas.
  • Compression Des Ressources

Si vous utilisez Eclipse pour le développement, assurez-vous que vous éteignez l' "Actif"Compression autrement ".le fichier apk dans le dossier raw aura double compressed et phone won't be able to recognize si l'application Mobile empaquette l'application wear ou non.

Meilleure Solution:

Utilisez Android Studio.

  1. Créer Un Projet Android
  2. Sélectionnez Téléphone Et de Porter le projet
  3. suivez les étapes de la création du projet
  4. copier toutes les permissions utilisées dans L'application Wear vers Mobile Manifeste de l'application ou vice versa
22
répondu Umer Farooq 2014-08-07 15:24:21

j'ai eu ussue avec porter des parfums de produits. J'avais des saveurs dans les applications portables et de vêtements. Pour résoudre mon problème j'ai utilisé le code suivant dans la construction.Grad fichier d'application portable:

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

gratuit et sont des saveurs à partir de l'ordinateur de poche module, wearfree et wearfull sont les saveurs de l'usure totale par module, Libération est le nom du module d'usure buildtype.

Et ne pas oublierpublishNonDefault true dans le bloc androïde de l'Échoppe d'usure.

5
répondu PavelGP 2016-06-06 12:25:40

j'ai eu ce problème même après avoir vérifié les noms de paquets, Les Id d'application, et m'être assuré que le module wear n'avait pas les permissions que le module portable n'avait pas.

mon problème était que je demandais la permission android.permission.BIND_NOTIFICATION_LISTENER_SERVICE dans AndroidManifest.xml pour le module portable. Il semble que cela ne devrait être demandé que pour le module portatif.

4
répondu Denley Bihari 2014-10-06 02:22:42

autant que je sache, les saveurs de produits ne sont pas prises en charge pour le moment, soit utiliser la construction manuelle (actif ou brut), soit supprimer les saveurs de produits.

2
répondu Demoritas 2014-07-31 14:21:07

D'après mon expérience, cela ne fonctionne que lors de la construction d'une version signée. Lors du déploiement d'une construction de débogage, il n'a jamais installé l'application wear pour moi. Avec signed release, il a fonctionné avec buildToolsVersion "19.1.0".

dans ce cas précis, je peux voir que vous utilisez "compiler project(':GooglePlay')". C'est que la dernière version? (compilation com.Google.Android.gms:jouer-services-portable:+')

2
répondu Heinrisch 2014-08-04 12:07:15

j'ai eu ce problème récemment, et à la fin de la suivante, il fixe;

  • Désinstaller l'application précédente
  • Redémarrez Le Téléphone
  • redémarrez l'usure
  • déconnecter et reconnecter l'usure
  • Re-Sync apps dans Android Wear application

et puis il est apparu sur la montre. Avant cela, j'ai tout essayé et j'étais convaincu que la construction ne fonctionnait pas correctement!--1-->

1
répondu The Applicationist 2015-05-06 21:56:12

je voulais juste ajouter quelque chose que je n'ai pas vu dans beaucoup de réponses.

Vous devez faire correspondre le applicationId dans votre application portative.

j'ai déjà pensé que vous avez besoin de <uses-feature android:name="android.hardware.type.watch" /> dans le Manifeste des appareils portatifs et de montre, avec add:android:required="true" pour le manifeste portable et android:required="false" pour le périphérique.

C'EST FAUX. Vous n'avez pas besoin de ce qui précède dans le manifeste portatif. En fait, avec Wear 2.0 à venir Google a fait quelques changements que ne vous permettra pas de télécharger l'apk avec minSdk inférieur à 23 si <uses-feature android:name="android.hardware.type.watch" /> est dans votre application portable. Désolé pour toute confusion.

1
répondu CJ Barnwell 2016-11-27 05:16:32

Eu le même problème, il s'est avéré que newrelic est instrumentant le Android Wear App. Essayez de commenter la ligne: // appliquer le plugin: 'newrelic'

Je n'ai pas pu trouver un moyen de dire à newrelic de se tenir à l'écart de l'application the wear...

0
répondu Jose Parente 2014-12-19 11:46:58