2016-08-30 6 views
1

Ich habe einige Fehler beim Auschecken in Paypal-Sandbox, Fehler tritt nur in Geräten mit Version Marshmallow, andere Version unterhalb als das war in Ordnung.PayPal SecurityException: Erfordert READ_PHONE_STATE

Fehlermeldung

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: [email protected] attribute=null, token = [email protected] 

Darf ich weiß jemand diese Probleme schlagen? Wird es durch Paypal-SDK verursacht? Vielen Dank für den gegebenen Vorschlag und die Antwort :)

+0

haben Sie versucht, die Berechtigung programmgesteuert zu prüfen? – Prashant

+0

ist die Ausnahme bei Marshmellow-Gerät? – apk

+0

@apk Ja, bitte lesen Sie die Frage – Prashant

Antwort

2

Wenn Sie App in Android-Version Eibisch laufen lassen, erfordert es die Erlaubnis von Benutzer, gibt es 2 Möglichkeiten, dies zu lösen. Entweder ändern Sie Ihre android: targetSdkVersion = "22" unter als 23 (Marshmallow) in Manifest-Datei.

Oder eine Funktion schreiben, die Erlaubnis zu bekommen:

// 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; 
    } 
} 

Wenn Ihre App-Anfragen Berechtigungen, wird das System ein Dialogfeld Benutzer zeigt, könnten Sie die Berechtigungen Anforderungsantwort behandeln möchten.

// 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; 
    }  
} 
1

Sie müssen Berechtigungen zur Laufzeit nehmen, wenn Sie dies nicht getan haben. Der Start von Marshmallow definierenden Berechtigungen in Manifest ist nicht genug. diesen Link sehen: https://developer.android.com/training/permissions/requesting.html

+0

danke für deine ideen. Und ich frage mich zu wissen, ist es anders, anstatt Berechtigungen vom Benutzer zu erhalten? Wie mit einem aktualisierten MPL oder Paypal-SDK? –

+0

Das hängt von der Bibliothek ab, wenn die Bibliothek bestimmte Berechtigungen benötigt, um zu funktionieren. Wir müssen die Erlaubnis zum Benutzer fragen. Bei Paypal, die 'INTERNET' und' READ_PHONE_STATE' erfordern. Sie haben also keine Möglichkeit mit Paypal. Aber wenn Sie Ihre Ziel-SDK von 23 auf eine niedrigere API herabstufen. Sie erhalten die Geräte-ID ohne diese Erlaubnis. es funktioniert, wenn es nur in Manifest deklariert wird. Sie können jedoch programmatisch keine anderen Berechtigungen anfordern. wenn du das willst. Sie müssen den Benutzer bitten, es manuell von den Einstellungen – Prashant

+0

in Ordnung zu tun, verstanden. Vielen Dank @ Prashant –

0
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 
     ); 
    } 
} 
} 
1

gibt es eine neue von Paypal MPL veröffentlicht, die ohne die Beantragung einer Genehmigung READ_PHONE_STATE in Paypal zur Kasse ermöglichen. Bitte beachten Sie diese link.

Verwandte Themen