Как начать звонок через приложение Android?

Я пытаюсь запустить намерение Skype из моего приложения для Android, передавая номер телефона. До сих пор, благодаря другим людям, которые здесь нуждаются в подобной рекламе на stackru, мне удалось запустить Skype, но все же я не могу передать номер телефона. Это код, который я использую:

Intent sky = new Intent("android.intent.action.CALL_PRIVILEGED");
        sky.setClassName("com.skype.raider",
                "com.skype.raider.Main");
        sky.setData(Uri.parse("tel:" + number));
        Log.d("UTILS", "tel:" + number);
        ctx.startActivity(sky);

Происходит то, что скайп запускается, но произносит тост, говоря, что номер недействителен, и предлагает добавить международный префикс. Log.d дает мне тел:+39........ (номер работает, я использую его также для

public static void call(String number, Context ctx) {
    try {
        Intent callIntent = new Intent(Intent.ACTION_CALL);
        callIntent.setData(Uri.parse("tel:" + number));
        ctx.startActivity(callIntent);
    } catch (ActivityNotFoundException e) {
        Log.e("helloandroid dialing example", "Call failed", e);
    }

}

На самом деле, когда я захожу в Skype для просмотра звонков, я вижу, что он составлен +0. Так что мне кажется, что я передаю номер телефона неверным образом или неправильной активности.... любой помощь будет очень ценится! А пока я просто хочу сказать, что Stackru просто потрясающий.

3 ответа

Решение

Смотрите этот ответ: /questions/15450664/zapustite-skype-iz-prilozheniya-programmno-i-vvedite-nomer-android/15450684#15450684

Джефф предлагает использовать skype:<user name> вместо tel:<phone number>

После некоторого изучения скайпа apk с apktool, как было предложено в этом ответе, я придумал этот код, для меня это работает:

public static void skype(String number, Context ctx) {
        try {
            //Intent sky = new Intent("android.intent.action.CALL_PRIVILEGED");
            //the above line tries to create an intent for which the skype app doesn't supply public api

                Intent sky = new Intent("android.intent.action.VIEW");
            sky.setData(Uri.parse("skype:" + number));
            Log.d("UTILS", "tel:" + number);
            ctx.startActivity(sky);
        } catch (ActivityNotFoundException e) {
            Log.e("SKYPE CALL", "Skype failed", e);
        }

    }

Обратитесь к разработчику Skype: http://developer.skype.com/skype-uris/skype-uri-tutorial-android Также не забудьте добавить "? Call" в ваш URL. Например

intent.setData(Uri.parse("skype:" + phoneNumber + "?call"));

Без этого скайп не может набрать номер.

Вы не должны включать определенный класс при вызове внешнего приложения. Позвольте пользователю выбрать приложение, которое он / она хочет использовать. Именно так был разработан android, и это лучшее решение, чем обязывать людей использовать софт (более того, довольно медленное, закрытое и неудобное приложение на мой взгляд).

Другими словами, просто используйте Uri, это задача скайпа заявить о своей способности улавливать такие намерения.

Обратитесь к этой ссылке на скайп-документ Skype URI tutorial: Android apps

Сначала нужно проверить, установлен ли скайп или не используется

/**
 * Determine whether the Skype for Android client is installed on this device.
 */
public boolean isSkypeClientInstalled(Context myContext) {
  PackageManager myPackageMgr = myContext.getPackageManager();
  try {
    myPackageMgr.getPackageInfo("com.skype.raider", PackageManager.GET_ACTIVITIES);
  }
  catch (PackageManager.NameNotFoundException e) {
    return (false);
  }
  return (true);
}

инициировать Skype URI с помощью

/**
 * Initiate the actions encoded in the specified URI.
 */
public void initiateSkypeUri(Context myContext, String mySkypeUri) {

  // Make sure the Skype for Android client is installed.
  if (!isSkypeClientInstalled(myContext)) {
    goToMarket(myContext);
    return;
  }

  // Create the Intent from our Skype URI.
  Uri skypeUri = Uri.parse(mySkypeUri);
  Intent myIntent = new Intent(Intent.ACTION_VIEW, skypeUri);

  // Restrict the Intent to being handled by the Skype for Android client only.
  myIntent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main"));
  myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

  // Initiate the Intent. It should never fail because you've already established the
  // presence of its handler (although there is an extremely minute window where that
  // handler can go away).
  myContext.startActivity(myIntent);

  return;
}

если Skype не установлен, перенаправьте его на рынок, используя

/**
 * Install the Skype client through the market: URI scheme.
 */
public void goToMarket(Context myContext) {
  Uri marketUri = Uri.parse("market://details?id=com.skype.raider");
  Intent myIntent = new Intent(Intent.ACTION_VIEW, marketUri);
  myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  myContext.startActivity(myIntent);

  return;
}
Другие вопросы по тегам