我正在尝试通过我的应用程序启动并将电话号码传递给Skype:
PackageManager packageManager = getPackageManager();
Intent skype = packageManager.getLaunchIntentForPackage("com.skype.raider");
skype.setData(Uri.parse("tel:65465446"));
startActivity(skype);
Skype已启动,但无法捕获号码。
我正在尝试通过我的应用程序启动并将电话号码传递给Skype:
PackageManager packageManager = getPackageManager();
Intent skype = packageManager.getLaunchIntentForPackage("com.skype.raider");
skype.setData(Uri.parse("tel:65465446"));
startActivity(skype);
Skype已启动,但无法捕获号码。
这段代码对我来说有效,可以启动两个Skype用户之间的通话:
Intent sky = new Intent("android.intent.action.VIEW");
sky.setData(Uri.parse("skype:" + user_name));
startActivity(sky);
要找到这个(和其他)内容,请使用apktool打开Skype APK。查看AndroidManifest.xml,您将看到所有已知的意图过滤器。如果您想触发其中一个意图过滤器,您需要创建一个能够匹配其的意图。这是上面代码所匹配的意图过滤器:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="skype" />
</intent-filter>
通过new Intent()
,您可以免费获得类别为“android.intent.category.DEFAULT”的内容,因此只需要设置操作和URI。
用于tel: URI的意图过滤器如下所示:
<intent-filter android:icon="@drawable/skype_blue" android:priority="0">
<action android:name="android.intent.action.CALL_PRIVILEGED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
所以您将动作设置为并为 Intent 提供了一个 tel: URI,"正确的事情"将发生。发生的是,Android找到了正确的提供程序来处理 tel: URI。它可能会获取用户输入,以选择电话应用程序和 Skype 之间的区别。Skype 处理 tel: URI 的优先级为零,即最低。因此,如果已安装电话应用程序,则它很可能会获取 Intent。
如果您想触发一个视频通话,您需要在Skype URI中添加"?call&video=true"。
Intent skypeVideo = new Intent("android.intent.action.VIEW");
skypeVideo.setData(Uri.parse("skype:" + "<username>" + "?call&video=true"));
startActivity(skypeVideo);
更多关于Skype URI的信息可在以下链接中找到: http://developer.skype.com/skype-uris-program/skype-uri-ref
如果您想要不使用任何意图选择器直接拨打Skype电话,请在您的清单文件中添加以下行...
<intent-filter
android:icon="@drawable/skype"
android:priority="0" >
<action android:name="android.intent.action.CALL_PRIVILEGED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
<intent-filter>
<intent-filter
android:icon="@drawable/skype"
android:priority="0" >
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.CALL" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="skype" />
</intent-filter>
</intent-filter>
Intent skype_intent = new Intent("android.intent.action.VIEW");
skype_intent.setClassName("com.skype.raider", "com.skype.raider.Main");
skype_intent.setData(Uri.parse("skype:skypeusername"));
startActivity(skype_intent);
使用此代码,您将获取Skype活动的意图而不是呼叫者活动的意图。因此,您必须查找具有用于操作CALL的意图过滤器的活动的意图。但更清楚地说,Skype使用操作 android.intent.action.CALL_PRIVILEGED,因此按此过滤器查找。 仅供信息,呼叫者活动为 cmp=com.skype.raider.contactsync.ContactSkypeOutCallStartActivity。
Intent sky = new Intent("android.intent.action.CALL_PRIVILEGED"); sky.setClassName("com.skype.raider", "com.skype.raider.contactsync.ContactSkypeOutCallStartActivity"); sky.setData(Uri.parse("tel:65465446")); startActivity(sky);
- ruben我发现上面的代码不起作用...
Intent i = packageManager.getLaunchIntentForPackage("com.skype.raider");
// i.setAction("android.intent.cation.CALL_PRIVILEGED");
// i.setClassName("com.skype.raider", "com.skype.raider.contactsync.ContactSkypeOutCallStartActivity");
// i.setData(Uri.parse("tel:5551234"));
startActivity(i);
注释掉的代码行要么使其无法正常工作,要么没有任何作用!
按照现有的代码,将调用Skype并到达一个页面,您可以在该页面上选择Skype联系人。如需更多信息,请随时提出。
约翰
Skype 2.X的清单与Skype 1.X有很大不同。没有ContactSkypeOutCallStartActivity。新的清单包含代码:
<activity android:name="com.skype.raider.Main" android:launchMode="singleTask" android:configChanges="keyboardHidden|orientation" android:windowSoftInputMode="adjustResize">
...
<intent-filter android:icon="@drawable/skype_blue" android:priority="0">
<action android:name="android.intent.action.CALL_PRIVILEGED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="tel" />
</intent-filter>
...
</activity>
所以你应该写成:
Intent skype_intent = new Intent("android.intent.action.CALL_PRIVILEGED");
skype_intent.setClassName("com.skype.raider", "com.skype.raider.Main");
skype_intent.setData(Uri.parse("tel:65465446"));
context.startActivity(skype_intent);