0

現在、VLC Media Player のリモートを作成しています。http-webinterface を使用して、サーバーに接続して制御します。バージョン 2.1.0 以降、VLC ではパスワードを設定する必要があります。これ自体は問題ありません。次のAjax-Requestで解決しました

checkConnection = function(id, folder){
$.ajax({
    url: 'http://' + data.ip + ":" + data.port + '/requests/status.xml',
    headers: {
        "Authorization" : "Basic " + data.authorization
    },
    timeout: 3000,
    success: function (data, status, jqXHR) {
        //Yeah do stuff
        }       
    },
    error: function(data){
        //Ohh, do stuff
    }
  });
};

コンピューターを使用して VLC http インターフェイスに接続すると、ユーザー名とパスワードの入力を求める標準のポップアップが表示されます。私の問題は、data.authorization のトークンが間違っていると、(電話を使用して) アプリがクラッシュすることです。Ripple で (Chrome を使用して) テストすると、上記のポップアップが表示されますが、タイムアウトが機能し、エラー処理が開始されます。これは Windows Phone では当てはまりません - ここでアプリがハングします (前述のとおり)。私はそれがwebviewであるため、WPがポップアップを表示しようとしましたが失敗したと思います。それからまた、タイムアウトが発生するはずですか?

同じ問題を抱えている人はいますか? もしそうなら、どのように解決しましたか?

4

1 に答える 1

0

やっと解決。これは非常に簡単で、C# でプラグインを作成するだけで済みました。同じ問題に遭遇する可能性のある人のために、コードを添付します。

using System;
using System.IO;
using System.Net;
using System.Runtime.Serialization;
using System.Text;
using System.Windows.Threading;
using WPCordovaClassLib.Cordova;

namespace WPCordovaClassLib.Cordova.Commands
{
    public class BasicAuth : BaseCommand
    {
        //Create timer to control timeout
        DispatcherTimer timeoutTimer = new DispatcherTimer();
        WebClient webClient = new WebClient();

    public BasicAuth(){
        timeoutTimer.Interval = TimeSpan.FromSeconds(5);
        timeoutTimer.Tick += new EventHandler(timeout);
        timeoutTimer.Start();
    }

    public void get(string options)
    {
        //Parse data that gets passed into the plugin
        string[] passedData = JSON.JsonHelper.Deserialize<string[]>(options);

        string ip = passedData[0];
        string port = passedData[1];
        string username = passedData[2];
        string password = passedData[3];            

        try
        {
            webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
            string credentials = String.Format("{0}:{1}", username, password);
            byte[] bytes = Encoding.UTF8.GetBytes(credentials);
            string base64 = Convert.ToBase64String(bytes);
            string authorization = String.Concat("Basic ", base64);
            webClient.Headers["Authorization"] = authorization;
            string url = //your url here
            var uri = new Uri(url);
            webClient.DownloadStringAsync(uri);
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Data);
            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ""));
            timeoutTimer.Stop();
        }
    }

    void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        try{
            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, e.Result)); //e.Result will fail if the server couldn't be contacted
        } catch{
            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ""));
        }
    }

    private void timeout(Object sender, EventArgs e)
    {
        webClient.CancelAsync(); //Cancel Async download
        timeoutTimer.Stop(); //Stop timer from beeing executed again
    }
}
}

JavaScript から呼び出すビットは次のとおりです。

cordova.exec(connectionSuccess, connectionError, "BasicAuth", "get", [data]);
于 2013-11-30T22:42:25.703 に答える