Estoy trabajando con Mark Murphy excelente Commonsware libros – pero es mucho para digerir. He construido el ‘FakePlayer’ app (pretende ser un reproductor de mp3). Contiene un servicio. Como una experiencia de aprendizaje traté de escribir un trivial de la aplicación (sólo tiene un botón), cuyo controlador haga clic en sí:

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

Funcionó muy bien el servicio de empezar a aceptar. Me di cuenta de Eclipse quejarse de ningún permiso en el servicio, así que he actualizado el servicio de manifiesto mediante la adición de 2 líneas, android:permisos y android:exporta:

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

Me vuelve a cargar el reproductor de la aplicación en el dispositivo (estoy usando un Galaxy S2) el uso de «debug» en eclipse. Parecía funcionar; el arranque de la aplicación causado un permiso de excepción, que yo esperaba.

Me agrega entonces el motor de arranque manifiesto de la aplicación (para darle el permiso):

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

Me vuelve a cargar en el arranque de la aplicación en el dispositivo (uso de depuración en Eclipse). Aún así obtener el permiso de error en el arranque de la aplicación.

He quitado las dos aplicaciones desde el dispositivo y volver a instalar (uso de depuración…), el servicio de aplicación en primer lugar, luego de arranque. Aún así obtener perm error.

Estoy trabajando mi camino a través de la ‘cómo utilizar un servicio remoto sección’ el Señor Murphy Avanzado de Android libro, así que me di cuenta de que esta no es la mejor manera tal vez a trabajar a través de aplicaciones.

Me hizo un «adb shell dumpsys paquete’, ubicado en el arranque de la aplicación, y la encontramos ‘permissionsFixed=false’ y no ‘grantedPermissions sección. Entiendo que esto significa que el manifiesto de cambio en el arranque de la aplicación no logra obtener el perm añadido a la aplicación. Pero no tengo idea de por qué. Como una experiencia de aprendizaje, es solo generaba confusión tan lejos….

Alguna pista muy apreciado! Gracias!

InformationsquelleAutor Art Swri | 2013-03-18

2 Comentarios

  1. 3

    He actualizado el servicio de manifiesto mediante la adición de 2 líneas, android:permisos y android:exportados

    Técnicamente, android:exported="true" es superflua, ya que la <intent-filter> hace automáticamente el <service> ser exportados.

    He quitado las dos aplicaciones desde el dispositivo y volver a instalar (uso de depuración…), el servicio de aplicación en primer lugar, luego de arranque. Aún así obtener perm error.

    No mostrar donde alguna vez declarar el permiso personalizado con el <permission> elemento. En la práctica, si el control de ambas aplicaciones, poner la misma <permission> elemento en ambos se manifiesta, de manera que el orden de instalación de dos de sus aplicaciones ya no importa.

    • También ayuda a incluir el <permiso> en el primer lugar. Gracias por la respuesta y por los excelentes libros y código de ejemplo. No volví a ver a algún código de ejemplo en el libro de Android que utiliza <permiso> de modo que pasa por alto en la mía. (Yo ¿ leer el capítulo, pero estoy muy de código ‘centrado’).
    • Bien, el libro que al parecer son de lectura («Advanced Android») fue retirado hace un año, con su contenido doblado en mi libro principal. Ese libro definitivamente cubre el <permission> elemento de permisos personalizados, ya que el uso de ellos en un plugin de ejemplo: github.com/commonsguy/cw-omnibus/tree/master/RemoteViews dicho esto, gracias por las amables palabras!
    • Wow estoy más atrás de lo que yo pensaba – mi suscripción ha caducado. Dejando ahora a renovar…
    • Para la segunda mitad de su respuesta – no es que lo que él hizo con el android:permiso=… dentro de la <servicios> etiqueta?
    • El android:permission atributo no declarar un permiso personalizado. <permission> hace. android:permission indica que un componente debe ser defendido por un permiso (personalizada o de otra manera), pero si ese permiso no existe, no va a ser utilizado.
  2. -1

    Trate de sustituir a este en su manifiesto

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

    lugar de

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

    Si esto no funciona, la amabilidad de publicar su error.

    • Es mi entendimiento de que la eliminación de la <intent> hará que se exporta a valor predeterminado es false, lo que significa que el servicio no es visible fuera de la aplicación que contiene. Así que lo que yo esperaba sucedió: el startService() en el arranque de la aplicación no hace nada – no hay nada visible que se encargará de la Intención. (No hay nada en el registro, además de la de Registro.d tengo en el botón de clic método. Agradezco tu esfuerzo, pero no creo que sea realmente una solución.

Dejar respuesta

Please enter your comment!
Please enter your name here