我正试图通过我的Android应用程序启动Skype意图,并传递一个电话号码。到目前为止,感谢其他人在stackoverflow上有类似的需求,我已经设法启动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);
正在发生的事情是skype启动了,但是给我一个祝酒词说这个号码无效,并建议我添加国际前缀。 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 所以在我看来,我以错误的方式传递电话号码,或错误的活动......任何帮助都将非常感激! 与此同时,我只想说StackOverflow只是摇滚。
答案 0 :(得分:17)
请参阅此答案:https://stackoverflow.com/a/8844526/819355
杰夫建议使用skype:<user name>
代替tel:<phone number>
在使用apktool对skype apk进行一些研究后,正如那个答案中所建议的那样,我想出了这个代码,对我来说它正在工作:
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);
}
}
答案 1 :(得分:7)
请参阅Skype开发人员:http://developer.skype.com/skype-uris/skype-uri-tutorial-android 还要记得添加&#34;?call&#34;在你的网址中。 E.g
intent.setData(Uri.parse("skype:" + phoneNumber + "?call"));
没有它,Skype可能无法拨打该号码。
答案 2 :(得分:4)
调用外部应用程序时,不应包含特定的类。让用户决定他/她想要使用的应用程序。这就是android的设计方式,它比一个人要使用软(而且速度相当慢,封闭且不方便的应用程序)更好的解决方案。
换句话说,只需使用Uri,这就是skype宣称能够捕获此类意图的工作。
答案 3 :(得分:0)
请参考此Skype文档链接Skype URI tutorial: Android apps
首先需要检查Skype是否已安装
/**
* 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;
}