puedo - permisos para usar camara android studio
Cómo otorgar permiso de MODIFY_PHONE_STATE para las aplicaciones se ejecutó en Gingerbread (5)
Escribo una aplicación que intenta modificar el estado de la llamada telefónica. Funciona bien en Android 2.2 o menos, pero lanza una excepción en Android 2.3 debido a la falta de permiso en android.permission.MODIFY_PHONE_STATE permiso (he declarado este permiso en AndroidManifest.xml). ¿Alguna idea? A continuación se muestra el registro de excepción:
01-15 09:14:23.210: ERROR/AndroidRuntime(404): FATAL EXCEPTION: main
01-15 09:14:23.210: ERROR/AndroidRuntime(404): java.lang.RuntimeException: Unable to start receiver test.PhoneReceiver: java.lang.SecurityException: Neither user 10031 nor current process has android.permission.MODIFY_PHONE_STATE.
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at android.app.ActivityThread.handleReceiver(ActivityThread.java:1780)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at android.app.ActivityThread.access$2400(ActivityThread.java:117)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:978)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at android.os.Handler.dispatchMessage(Handler.java:99)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at android.os.Looper.loop(Looper.java:123)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at android.app.ActivityThread.main(ActivityThread.java:3647)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at java.lang.reflect.Method.invokeNative(Native Method)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at java.lang.reflect.Method.invoke(Method.java:507)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-15 09:14:23.210: ERROR/AndroidRuntime(404): at dalvik.system.NativeStart.main(Native Method)
El problema que tienes se introdujo en Android 2.3 (Gingerbread). Cualquier código que tengas que requiera MODIFY_PHONE_STATE funcionará hasta (e incluyendo) Android 2.2, pero se romperá para Android 2.3+.
David Brown registró un cambio que limita el uso del permiso MODIFY_PHONE_STATE a las aplicaciones del sistema. Las aplicaciones del sistema son
- Preinstalado en una carpeta del sistema en la ROM
- Compilado por un fabricante usando su certificado de seguridad
Sospecho que estás tratando de usar una API oculta como ITelephony. Yo estaba ... y me quemé por este cambio. La justificación del equipo de Android es que era una API oculta que no debería haber usado en primer lugar.
Dicho esto, se abrió una solicitud de mejora para crear una API de telefonía pública adecuada, pero Google eliminó el ticket. Parece que su postura es que no tienen la intención de invertir la dirección y estas API no son para el consumo público.
MODIFY_PHONE_STATE es un permiso de solo sistema, por lo que las aplicaciones no pueden obtenerlo.
Esto puede haber cambiado con respecto a las versiones anteriores de la plataforma, pero está bien porque solo protege las API privadas, por lo que si está haciendo algo que lo requiere, está utilizando API privadas que no son compatibles y generará cosas como su aplicación. rompiendo diferentes construcciones de la plataforma.
El rastreo de pila que incluye no está completo, por lo que no hay forma de saber qué está haciendo en realidad.
Prueba esto.
public static void answerPhoneHeadsethook(Context context) {
// Simulate a press of the headset button to pick up the call
// SettingsClass.logMe(tag, "Simulating headset button");
Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
context.sendOrderedBroadcast(buttonDown, "android.permission.CALL_PRIVILEGED");
// froyo and beyond trigger on buttonUp instead of buttonDown
Intent buttonUp = new Intent(Intent.ACTION_MEDIA_BUTTON);
buttonUp.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
context.sendOrderedBroadcast(buttonUp, "android.permission.CALL_PRIVILEGED");
}
Si su aplicación para Gingerbread se está ejecutando en una tableta y no hay teléfono, entonces este es el comportamiento esperado. Tendrá que hacer que los permisos relacionados con la telefonía en su manifiesto no sean obligatorios para ejecutarse en tabletas.
Prueba esto en tu manifiesto:
<uses-feature android:name="android.hardware.telephony"
android:required="false" />
Por supuesto, estoy haciendo una gran suposición sobre la tableta. También puede ver la referencia de Android here .
Tengo la solución.
En lugar de anular la pantalla de llamada entrante, haz dos cosas debajo. lo que le permitirá acceder al botón Aceptar y rechazar y también le permitirá mostrar la pantalla sobre la pantalla de la llamada entrante.
(1) Hacer una clase de receptor:
public class MyPhoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null)
{
String state = extras.getString(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING))
String phoneNumber = extras.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
Intent i = new Intent(context, IncomingCallActivity.class);
i.putExtras(intent);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
}
(2) su actividad xml se ve así:
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="top"
android:gravity="top"
android:orientation="vertical"
android:windowAnimationStyle="@android:style/Animation.Translucent"
android:windowBackground="@android:color/transparent"
android:windowIsTranslucent="true"
(3) Haga que el diseño de su actividad sea transparente (lo cual vendrá por encima de la pantalla de llamadas), escriba el código a continuación en el mensúmen
<activity android:name=".IncomingCallActivity"
android:theme="@android:style/Theme.Translucent">
</activity>
(4) En mensualmente agrega tu amplio receptor de reparto
<receiver android:name="MyPhoneReceiver" >
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" >
</action>
</intent-filter>
</receiver>
(5) agregue el código siguiente en oncreate () de IncomingCallActivity
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
¡Aclamaciones!
¡Avísame si enfrentas algún problema!