Programmierung Handy App



  • Ich habe neuerdings angefangen ein bischen mit der Programmierung von HandyApplications rumzuspielen.
    In diesem Teil bin ich leider noch relativ frisch und hadere mit einem Problem, bei dem ich nicht weiter komme.

    Das was an Informationen von Nöten ist => Meine Umgebung:

    Visual Studio Professional 2017
    Integriertes Xamarin Studio
    Debugging auf einem realen Device (Android Samsung Galaxy S7)
    Entwicklertools auf dem Handy aktiviert
    Webrequest-Target Api Schnittstelle
    Programmiert wird eine Xamarin Forms Anwendung

    Einstellungen im Projekt:
    Http Client Implementierung => Android
    SSL/TLS- Implementierung => Natives TLS 1.2+
    (ohne die beiden Einstellungen haben WebRequests nicht funktioniert.
    Es kam nicht Mal zu einer Antwort des Zielservers. )

    Ich habe es nun geschafft eine Applikation auf das Handy zu bekommen.
    Dort habe ich schlicht eine Activity, die über mehrere Buttons auf SubActivities zugreifen lässt.
    Eine dieser Subactivities soll eine Suche über das Web realisieren.

    Dazu muss ich sagen, dass das auf dem PC ziemlich easy going war. In der App wird die Suche über einen Button gestartet, der asynchron verläuft, weil ich bei meinen Recherchen festgestellt habe, dass das sinnvoll ist, damit die App nicht einfriert, solange der Webrequest auf die Rückmeldung des Servers wartet.

    Auf dem Handy erhalte ich leider stets die Fehlermeldung:

    Exception:

    System.Net.WebException: The remote server returned an error: (401) Unauthorized.

    Dies liegt nach Recherche an fehlerhaften Credentials oder Authorisierungstoken.
    Die Credentials werden für den Zugriff nun garnicht benötigt, dass ist auch schon auf dem PC in einer Windows Forms Anwendung so gewesen und der Token hat dort funtkioniert. Genau deshalb verstehe ich nicht, wieso es auf dem Handy nicht funktioniert?

    Der Aufruf in der Activity sieht wiefolgt aus:

    var btnSearch = new Button(this)
    {
        Text = "Suchen"
    };
    btnSearch.Click += async (sender, e) => {
    string search = entry.Text;
    Task<int> sizeTask = RequestMetaProduct(search);
    ....
    var intResult = await sizeTask;
    };
    
    Layout.AddView(btnSearch);
    

    Wundert euch nicht, dass ich hier nur ein int verwurste, dass ist einfach nur ein schlichter Test, der erstmal klar machen soll, ob ich überhaupt etwas als Rückmeldung erhalte.

    public static async Task<int> RequestMetaProduct(string name)
    {
        string url = "https:...API Adresse";
    
        Task<JsonValue> contentsTask = RequestFromServerAsync(url);
        string contents = await contentsTask;
    
        int exampleInt = contents.Length;
        return exampleInt;
    }
    
    private static async Task<JsonValue> RequestFromServerAsync(string url)
    {
        try
        {
            string responseString = string.Empty;
            string method = "GET";
    
            Uri uri = new Uri(url);
            HttpWebRequest request = new HttpWebRequest(uri)
            {
                Method = method
            };
    
            var header = new OAuthHeader();
    
            string authorizationheader = await header.GetAuthorizationHeader(method, url);
            request.Headers.Add(HttpRequestHeader.Authorization, authorizationheader);
            request.ContentType = "application/json";
            var response = (HttpWebResponse)await request.GetResponseAsync(); 
                 ....
    

    Meine Vermutung ist aktuell, dass der Fehler potentiell auftritt, weil header.GetAuthorizationHeader zwar als Async deklariert ist, die Methode wird aber synchron ausgeführt, weil ich da keine Await Bezeichner reingebaut bekomme.
    Ich verstehe diese immer so, dass sie angewendet werden können, wenn es einen weiteren Methodenaufruf gibt innerhalb der Methode. Ich weiß aber nicht, wie das in einer schlichten Methode gehen soll:

    public async Task<string> GetAuthorizationHeader(string method, string url)
    {
        ...
        HMAC hasher = HMACSHA1.Create();
        hasher.Key = Encoding.UTF8.GetBytes(signatureKey);
        Byte[] rawSignature = hasher.ComputeHash(Encoding.UTF8.GetBytes(baseString));
        String oAuthSignature = Convert.ToBase64String(rawSignature);
    
        ...
    
        String authHeader = "OAuth " + String.Join<String>(", ", headerParamStrings);
    
        return authHeader;
    }
    

    Kann das Problem mit meiner Vermutung zu tun haben?
    Wenn ja, wie asynchronisiere ich dann so eine Methode?
    Oder hat jemand eine Idee, wie der Fehler anderweitig zu Stande kommen kann?
    Wenn dazu noch Informationen fehlen, dann reiche ich die gerne nach.



  • Hi

    Könnte an einem Fehlerhaften Android Manifest liegen. Check das mal.

    Grüße