【问题标题】:PayPal SecurityException: Requires READ_PHONE_STATEPayPal SecurityException:需要 READ_PHONE_STATE
【发布时间】:2017-01-06 11:32:20
【问题描述】:

我在 Paypal-sandbox 中尝试结帐时遇到了一些错误,错误仅发生在具有 Marshmallow 版本的设备中,低于该版本的其他版本工作正常。

错误信息

Fatal Exception: java.lang.SecurityException: getDeviceId: Neither user 10179 nor current process has android.permission.READ_PHONE_STATE.
       at android.os.Parcel.readException(Parcel.java:1620)   
       at android.os.Parcel.readException(Parcel.java:1573)
       at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:4207)
       at com.paypal.android.c.k.a(Unknown Source)
       at com.paypal.android.c.f.B(Unknown Source)
       at com.paypal.android.c.f.d(Unknown Source)
       at com.paypal.android.c.f$3.run(Unknown Source) 
       Background sticky concurrent mark sweep GC freed 25935(1829KB) AllocSpace objects, 47(6MB) LOS objects, 8% free, 87MB/95MB, paused 7.704ms total 70.036ms
       NeighborEvent{elapsedMs=2177754483, 192.168.0.1, [AC220B8E9BEB], RTM_NEWNEIGH, NUD_REACHABLE}
       START u0 {cmp=com.luulla.mobile.android/com.paypal.android.MEP.PayPalActivity (has extras)} from uid 10179 on display 0
       Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@724f030 attribute=null, token = android.os.BinderProxy@760242f

我可以知道有人遇到过这个问题吗?它是由 Paypal-SDK 引起的吗?非常感谢给定的建议和回答:)

【问题讨论】:

  • 您是否尝试过以编程方式检查权限?
  • marshmellow 设备是否发生异常?
  • @apk 是的,请阅读问题
  • 签入清单文件。
  • @safinhacko 对于低于 API 23 的设备工作正常,我认为这应该不是问题

标签: android android-permissions paypal


【解决方案1】:

如果没有,您需要在运行时获取权限。 从棉花糖开始在清单中定义权限是不够的。 看到这个链接:https://developer.android.com/training/permissions/requesting.html

【讨论】:

  • 感谢您的想法。而且我想知道它是否有任何其他方式而不是从用户那里获得权限?喜欢使用更新的 MPL 或 Paypal-SDK 吗?
  • 这取决于 library ,如果 library 需要一些特定的权限才能工作。我们需要强制要求用户许可。在需要 INTERNETREAD_PHONE_STATE 的贝宝的情况下。所以你对贝宝没有任何选择。但是,如果您将目标 sdk 从 23 降级到任何较低的 API。未经该许可,您将获得设备 ID。如果仅在清单中声明它,它将起作用。但您将无法以编程方式请求其他权限。如果你想这样做。您必须要求用户从设置中手动完成
【解决方案2】:
Call this class where you want to access the phone state.

public class RequestUserPermission {

private Activity activity;
// Storage Permissions
private static final int REQUEST_READ_PHONE_STATE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_PHONE_STATE,
};

public RequestUserPermission(Activity activity) {
    this.activity = activity;
}

public  void verifyStoragePermissions() {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_PHONE_STATE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_READ_PHONE_STATE
        );
    }
}
}

【讨论】:

    【解决方案3】:

    如果您在 android 版本 Marshmallow 中运行应用程序,则需要用户许可,有两种方法可以解决此问题。 您可以在清单文件中将 android:targetSdkVersion="22" 更改为低于 23(Marshmallow)。

    或者写一个函数来获取权限:

    // ID to identify phone permissions request 
    private static final int REQUEST_READ_PHONE_PERMISSIONS = 1; 
    
    // called this when "Checkout" button clicked
    // function to get permission from user  
    public void getUserPermission()
    {
         // check whether "READ_PHONE_STATE" permission is granted or not
         if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
         {
             // we do not have the permissions, we need to request permission from user
             ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, REQUEST_READ_PHONE_PERMISSIONS);
             return;
         }
    }
    

    当您的应用请求权限时,系统会向用户显示一个对话框,您可能需要处理权限请求响应。

    // Write a callback method
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        switch (requestCode)
        {
            case REQUEST_READ_PHONE_PERMISSIONS:
                // if request is cancelled, the result arrays are empty
                if (grantResults.length == 0 || grantResults[0] == PackageManager.PERMISSION_DENIED)
                {
                     // permissions denied. Show message to user with explanations
                    AlertDialog.Builder alert = new AlertDialog.Builder(this);
                    alert.setMessage("This app is designed for android version Marshmallow and above. Denying permission will cause unable to Checkout.");
                    alert.setPositiveButton("Ok", null);
                    alert.show();
                }
    
                // if we get permissions from user, proceed to checkout in Paypal
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                {
                    // continue with proceed to checkout 
                }
                return;
        }       
    }
    

    【讨论】:

      【解决方案4】:

      有一个新版本的 Paypal MPL 允许在 Paypal 中结帐而无需请求 READ_PHONE_STATE 权限。请参考这个link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-03
        • 2021-07-26
        相关资源
        最近更新 更多