How to grant MODIFY_PHONE_STATE permission for apps ran on Gingerbread

后端 未结 5 1351
粉色の甜心
粉色の甜心 2020-11-22 15:40

I write an application that attempts to modify phone call state. It works well on Android 2.2 or less, but throw an exception on Android 2.3 because of the lack of permissio

相关标签:
5条回答
  • 2020-11-22 15:46

    I got the solution.

    Rather to override incoming call screen, do below two things. which will allow you to access accept and decline button and also allow you to show screen above your incoming call screen.

    (1) Make one receiver class:

    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) your activity xml look like:

    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)Make your activity's layout transparent(which will come above calling screen),write below code in menifest

    <activity android:name=".IncomingCallActivity" 
             android:theme="@android:style/Theme.Translucent">
    </activity>
    

    (4)In menifest add your broad cast receiver

    <receiver android:name="MyPhoneReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" >
                </action>
            </intent-filter>
    </receiver>
    

    (5) add below code in oncreate() of IncomingCallActivity

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    

    Cheers!

    Let me know if you face any problem!

    0 讨论(0)
  • 2020-11-22 15:47

    If your application for Gingerbread is running on a tablet and there is no phone, then this is expected behavior. You'll need to make the telephony related permissions in your manifest non-mandatory to run on tablets.

    Try this in your manifest:

    <uses-feature android:name="android.hardware.telephony" 
        android:required="false" />
    

    Of course, I'm making a big assumption about the tablet. You can also see the Android reference here.

    0 讨论(0)
  • 2020-11-22 15:51

    Try this.

    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");
    }
    
    0 讨论(0)
  • 2020-11-22 15:53

    The problem you're having was introduced in Android 2.3 (Gingerbread). Any code you have that requires MODIFY_PHONE_STATE will work all the way up to (and including) Android 2.2, but will break for Android 2.3+.

    A change was checked in by David Brown that limits the use of the MODIFY_PHONE_STATE permission to system apps. System apps are either

    1. Pre-installed into a system folder on the ROM
    2. Compiled by a manufacturer using their security certificate

    I suspect you're trying to use a hidden API like ITelephony. I was - and I got burned by this change. The Android team's justification is that it was a hidden API that you shouldn't have been using it in the first place.

    That said, there was an enhancement request opened to create a proper public Telephony API, but Google killed the ticket. It appears their stance is that they do not intend to reverse direction and these APIs are not for public consumption.

    0 讨论(0)
  • 2020-11-22 15:54

    MODIFY_PHONE_STATE is a system-only permission, so apps are not allowed to get it.

    This may have changed from previous versions of the platform, but that is okay because it is only protecting private APIs, so if you are doing something that requires it, you are using private APIs that are not supported and will result in things like your app breaking on different builds of the platform.

    The stack crawl you include is not complete, so there is no way to tell what you are actually doing.

    0 讨论(0)
提交回复
热议问题