Nano Hash - криптовалюты, майнинг, программирование

Как отобразить защищенный блог в WebView (setHttpAuthUsernamePassword)

Я хотел бы показать защищенный блог в веб-просмотре. Блог находится на сайте Google blogger.com.

Имя пользователя и пароль предоставляются самим приложением (так что пользователю не нужно ничего вводить):

Я использую следующий код, но он не работает, так как он просит пользователя ввести свое имя пользователя и пароль (только при первом входе в систему, затем он сохраняется и работает нормально)? Что случилось ? Что я должен использовать как «область» в:

webview.setHttpAuthUsernamePassword(URL_WebView, "", getString(R.string.username), getString(R.string.password));

Весь код на данный момент:

public class Main extends Activity {
/** Called when the activity is first created. */

String URL_WebView = "http://myblog.blogspot.com/";

public static Context mContext;
static SharedPreferences prefs;

static int log_number;
Boolean terms_agreed;           

//GoogleAnalyticsTracker tracker;
//static String analytics_tracker = "UA-11967031-29";

WebView webview;
private static final FrameLayout.LayoutParams ZOOM_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);
    this.webview = (WebView)findViewById(R.id.webkitWebView1);

    mContext = this;

    reading_the_prefs();
    log_number = log_number + 1;

    if (log_number >= 2) {
        if ((!terms_agreed)){
            TermsDialog();
        }
    }

    /*
    tracker = GoogleAnalyticsTracker.getInstance();
    tracker.start(analytics_tracker, this);
    tracker.trackPageView("/Main");
    */

    // adding the zoom controls ...
    FrameLayout mContentView = (FrameLayout) getWindow().getDecorView().findViewById(android.R.id.content);
    final View zoom = this.webview.getZoomControls();
    mContentView.addView(zoom, ZOOM_PARAMS);
    zoom.setVisibility(View.GONE);

    WebSettings settings = webview.getSettings();
    settings.setJavaScriptEnabled(true);
    webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

    webview.setWebViewClient(new MyWebViewClient ());

    //webview.savePassword(URL_WebView, getString(R.string.username), getString(R.string.password));    
    webview.setHttpAuthUsernamePassword(URL_WebView, "", getString(R.string.username), getString(R.string.password));   
    webview.loadUrl(URL_WebView);

}

//======================================================================================

private class MyWebViewClient extends WebViewClient {

    public void onReceivedHttpAuthRequest(WebView view,
            HttpAuthHandler handler, String host, String realm) {

        handler.proceed(getString(R.string.username), getString(R.string.password));        
        Log.i("Hub","Host ="+host+" with realm ="+realm);
    }

    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        Log.e("Hub", "Error: " + description);
        Toast.makeText(Main.this, "Oh no! " + description, Toast.LENGTH_LONG).show();
    }
}

//======================================================================================

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, 99, 3, "Exit").setIcon(android.R.drawable.ic_menu_delete);
    menu.add(0, 999, 2, "Terms of Service").setIcon(android.R.drawable.ic_menu_agenda);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
    case 99:
        finish();
        break;
    case 999:
        //tracker.trackPageView("/TERMS_OF_SERVICE");
        TermsDialog();
        break;
    }
    return super.onOptionsItemSelected(item);
}

// =================================================================================
public void TermsDialog(){

    AlertDialog.Builder ad = new AlertDialog.Builder(this);
    ad.setIcon(R.drawable.icon);
    // custom Title - that's the way I found to center it !
    TextView title = new TextView(mContext);
    title.setText(R.string.TermsDialog_Title);
    title.setBackgroundColor(Color.BLACK);
    title.setPadding(10, 10, 10,10);
    title.setGravity(Gravity.CENTER);
    title.setTextColor(Color.WHITE);
    title.setTextSize(20);
    // to center the TITLE :
    ad.setCustomTitle(title);

    ad.setView(LayoutInflater.from(this).inflate(R.layout.terms_dialog,null));

    ad.setPositiveButton(R.string.TermsDialog_Yes, 
            new android.content.DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int arg1) {
            //OK, save accepted Terms and Service into the Prefs.
            terms_agreed = true;
            //tracker.trackPageView("/Terms_agreed");
            saving_the_prefs();
        }
    }
    );

    ad.setNegativeButton(R.string.TermsDialog_No, 
            new android.content.DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int arg1) {
            terms_agreed = false;
            //tracker.trackPageView("/Terms_NOT_agreed");
            saving_the_prefs(); 
            finish();
        }
    }
    );

    ad.setCancelable(false);

    ad.show();
}

// =================================================================================
private void reading_the_prefs() {

    prefs = getSharedPreferences("Market_Wrap", 0);
    log_number = prefs.getInt("log_number" , 0);
    terms_agreed = prefs.getBoolean("terms", false);
    Log.i("Hub", "log_number="+log_number);  
    Log.i("Hub", "terms_agreed="+terms_agreed);  

}
// =================================================================================
public void saving_the_prefs() {

    prefs = getSharedPreferences("Market_Wrap", 0);
    SharedPreferences.Editor editor = prefs.edit();

    editor.putInt("log_number", log_number);
    editor.putBoolean("terms", terms_agreed);
    editor.commit();
}
// =================================================================================

@Override
protected void onPause() {
    super.onPause();

    //tracker.dispatch();
    //tracker.stop();
    saving_the_prefs();
}
// =================================================================================

}

Я пытался следовать совету здесь, но похоже

public void onReceivedHttpAuthRequest(WebView view,
            HttpAuthHandler handler, String host, String realm) {

        handler.proceed(getString(R.string.username), getString(R.string.password));        
        Log.i("Hub","Host ="+host+" with realm ="+realm);
    }

никогда не срабатывает (в MyWebViewClient) по какой-либо причине?

РЕДАКТИРОВАТЬ: Может быть, мне нужно реализовать OAuth на стороне клиента на Android?

как здесь

10.07.2011

Ответы:


1

Из setHttpAuthUsernamePassword, вам необходимо указать хост сайта: поэтому, если вы обращаетесь (например) к http://www.google.com с именем пользователя и паролем из вашего кода и области Protected, вы бы сделали

webview.setHttpAuthUsernamePassword("www.google.com", "Protected", getString(R.string.username), getString(R.string.password));

Вы можете получить область, посмотрев опубликованную область в своем браузере: например, в Firefox, если вы откроете http://tools.dynamicdrive.com/password/example/ вы увидите следующий текст в заголовке: Имя пользователя и пароль запрашиваются http://tools.dynamicdrive.com. На сайте написано: «Запретная зона. В данном случае это Запретная зона.

10.07.2011
  • Я не вижу такого царства. Вот рассматриваемый блог: theodiousscribe.blogspot.com - как вы думаете, какую сферу мне следует использовать? Спс за вашу помощь! 10.07.2011
  • Это сайт аутентификации с помощью формы, а не веб-сайт с базовой аутентификацией: вы не можете использовать webview.setHttpAuthUsernamePassword для аутентификации в этом блоге. Вам нужно будет посмотреть на использование файлов cookie для входа. 10.07.2011
  • Хорошо, тогда я посмотрю на это. Знаете ли вы какой-нибудь хороший учебник о том, как это сделать ...? Я никогда не работал с печеньем. Это выглядит просто, но как определить правильные файлы cookie (пары имя-значение) и URL + перенаправляет для использования в этом случае ... это то, что мне нужно. Специально для blogger.com Google. Но я думаю, что любой туто для Gmail тоже подойдет. 11.07.2011
  • http://www.java-tips.org/other-api-tips/httpclient/how-to-perform-form-based-logon.html показывает базовый процесс аутентификации на основе файлов cookie. Вам нужно будет изменить URL-адреса, сформировать поля ввода и имена файлов cookie на основе интерфейса Blogger, но в основном это то, что вам нужно. 11.07.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..