Как узнать, активен ли в данный момент вызов Skype на Android - PullRequest
8 голосов
/ 13 января 2012

Хорошо, я декомпилировал манифест Skype, чтобы узнать, есть ли какие-либо Услуги или Трансляции, выполняемые во время разговора. Есть только несколько внутренних трансляций для входящих звонков. Также существует только один получатель и одна услуга.

Я контролировал все запущенные сервисы с моим приложением, но SkypeMainService всегда работает, даже если не во время вызова.

Также AudioMode не изменяется скайпом (но в соответствии с logcat-логами, которые разработчик хотел, но они просто не делают этого), поэтому я не могу просто проверить, если это MODE_IN_CALL.

Есть ли у вас какие-либо предложения, как узнать, работает ли Skype в данный момент и имеет ли активный вызов?

Спасибо!

/ edit: краткий обзор мероприятий и т. Д .:

<activity android:name="com.skype.raider.Main">
<activity-alias android:name="com.skype.raider.ui.SplashScreenActivity" android:targetActivity="com.skype.raider.Main">
<receiver android:name="com.skype.MainReceiver" android:enabled="true" android:exported="false">
   <action android:name="android.intent.action.BOOT_COMPLETED" />
   <action android:name="android.intent.action.MEDIA_MOUNTED" />
   <action android:name="android.intent.action.SEARCH" />
   <action android:name="android.intent.action.CALL_PRIVILEGED" />
   <action android:name="com.skype.raider.INCOMING_GSM_CALL" />
   <action android:name="com.skype.raider.ON_GSM_CALL" />
   <action android:name="com.skype.raider.intent.action.request_sync" />
</receiver>
<service android:name="com.skype.MainService">

Ответы [ 3 ]

2 голосов
/ 22 января 2012

Хорошо, я очень надеялся, что кто-нибудь даст полезный ответ. Тем не менее, я взял совет Рувима в комментарии и сделал этот метод:

/**
 * Gets the current activity
 * 
 * @param context
 *            A context to use
 * @return The Activity name
 */
public static String getCurrentTopActivity(Context context) {
    ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
    ActivityManager.RunningTaskInfo ar = RunningTask.get(0);
    return ar.topActivity.getClassName().toString();
}

Затем я проверяю, равен ли результат com.skype.raider.Main. Также будет возвращено значение true, если нет активных вызовов Skype, но главное приложение открыто.

Спасибо за помощь, особенно Рувим!

Редактировать: Вам потребуется следующее разрешение в манифесте

<uses-permission android:name="android.permission.GET_TASKS"/>
0 голосов
/ 21 января 2012

Есть несколько вещей, которые вы можете сделать, чтобы увеличить свой шанс угадать:

1) Проверьте, запущено ли приложение:

ActivityManager activityManager = (ActivityManager) this.getSystemService( ACTIVITY_SERVICE );
    List<RunningAppProcessInfo> procInfos = actvityManager.getRunningAppProcesses();
    for(int i = 0; i < procInfos.size(); i++){
        if(procInfos.get(i).processName.equals("com.android.browser")) {
            Toast.makeText(getApplicationContext(), "Browser is running", Toast.LENGTH_LONG).show();
        }
    }

2) Проверьте состояние телефона для обмена данными с помощью PhoneManager

3) и наконец проверьте Skype страницу разработчиков для любого известного API

0 голосов
/ 20 января 2012

В тот день, когда Skype изменяет что-либо из этого (возможно, это обновление будет через 2 дня - до того, как вы закончили писать код), ваш код может сломаться. Так что я не думаю, что стоит пытаться что-либо в этом роде.

Извините, это не может быть "ответом", но я не думаю, что время, потраченное на это, того стоит.

...