【问题标题】:android.permission.CALL_PHONE for tabletsandroid.permission.CALL_PHONE 平板电脑
【发布时间】:2011-12-14 12:57:58
【问题描述】:

我正在开发一个应用程序,并且在清单中我有:

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

当我点击按钮执行这段代码时:

Intent intentcall = new Intent();
intentcall.setAction(Intent.ACTION_CALL);
intentcall.setData(Uri.parse("tel:" + phonenumber)); // set the Uri
startActivity(intentcall);

它可以在手机上正常运行,在平板电脑上会弹出一个显示屏,您可以在其中查看号码或将号码添加到联系人。但是,如果我在清单中保留许可,则市场上的平板电脑无法使用。我怎样才能保持代码行为并且仍然在平板电脑和手机市场上显示?

【问题讨论】:

    标签: android permissions


    【解决方案1】:

    不要添加具有ACTION_CALL 标识符的用户,而是将其更改为ACTION_INSERT_OR_EDIT

    您也需要这些权限,而不是 CALL_PHONE 权限:

    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>
    

    看看这个相关的问题:

    can't find app on market

    【讨论】:

    • 问题是,如果可能的话,我仍然想给他们打电话。但是,如果我使用 ACTION_CALL,平板电脑似乎已经考虑到了这一点,并启动了自己的意图来显示和保存联系人。
    • 市场根据属性过滤应用程序,因此只要存在 CALL_PHONE 权限,您将无法将此应用程序提供给市场上的平板电脑。如果您希望平板电脑可用,您可能需要为平板电脑制作单独的应用程序。
    • 这很奇怪,因为当我从 eclipse 在 Xoom 上运行它时,它的表现非常好。
    • 我猜 android 预计会在实际上不支持这些功能的设备上测试某些功能,并将它们映射到其他领域。我确实认为他们试图要求程序的功能只做用户想要做的事情,并且发送一个意图打电话给某人并弹出一个添加联系人屏幕在大多数情况下不是用户想要做的。我猜这是他们将这些过滤器应用于市场的原因之一。
    【解决方案2】:

    在你需要的AndroidManifest中:

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

    CALL_PHONE 权限意味着需要电话,但如果您指定不是,则不会被过滤。

    【讨论】:

    • 我想我没有提到如果我这样做,上面的代码会在单击按钮时导致崩溃。
    • @Kevin,应用程序不会被过滤,但是每当应用程序尝试使用调用功能时,Android 都会抛出 java.lang.SecurityException: Permission Denial: starting Intent (...) requires android .permission.CALL_PHONE
    • 您仍然需要添加 CALL_PHONE 权限,但如上所述设置使用功能允许它是可选的,因此您仍然可以在 wifi 设备(例如平板电脑)上下载它。
    【解决方案3】:

    关于“使用功能”和它崩溃 - 您是否在实际拨打电话之前检查电话是否可用?当应用程序在平板电脑上时,您可能需要执行额外的步骤。您在清单中所说的只是该功能不是必需的。它可能依赖于您实际实现围绕它的逻辑。

    【讨论】:

    • 我以为我检查正确,你能详细说明如何正确检查吗?
    • 好吧,我必须检查我在做什么......我最初是这样做的:boolean hasPhone = getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);但我对自己有一个注意,这在某些手机上可能会出现问题。你在用什么
    • 我想我正在使用 checkPermission(__, __)。等我拿到 Android 手机后,我会试试这个并报告。
    • 尝试捕获 SecurityException 可能吗?
    【解决方案4】:

    来自谷歌文档:

    声明的元素仅供参考,这意味着 Android 系统本身不检查匹配的功能支持 在安装应用程序之前在设备上

    仅供google play使用

    【讨论】:

      【解决方案5】:

      尝试使用 Intent.ACTION_DIAL 代替 Intent.ACTION_CALL。

      例如:

      try {
         Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phone_number));
         startActivity(intent);
      } catch (Exception e) {
          //TODO smth       
      }
      

      在这种情况下,您可以从 AndroidManifest.xml 中完全删除这些标签:

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

      【讨论】:

      • 酷。未经许可。
      • 这应该是答案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2011-10-02
      • 2012-11-10
      相关资源
      最近更新 更多