سؤال

هل هناك طريقة لاسترداد وكيل المستخدم للمتصفح دون وجود ملف WebView في النشاط؟

أعلم أنه من الممكن الحصول عليها عبر WebView:

WebView view = (WebView) findViewById(R.id.someview);
String ua = view.getSettings().getUserAgentString() ;

لكن في حالتي ، ليس لدي/أحتاج إلى كائن WebView ولا أريد إنشائه فقط لاسترداد سلسلة وكيل المستخدم.

هل كانت مفيدة؟

المحلول

إذا لم تفعل لديك واحد يمكنك محاولة أخذها مثل هذا

String ua=new WebView(this).getSettings().getUserAgentString();

تعديل-

المستند ل getUserAgentString() يقول

إرجاع سلسلة وكيل المستخدمين في WebView.

لذلك لا أعتقد أنه يمكنك الحصول عليها إلا إذا أعلنت واحدة. شخص ما يصححني إذا كنت مخطئًا

نصائح أخرى

هناك طريقة أبسط بكثير إذا كنت على Android 2.1 أو أعلى. منحت هذه ليست هي نفس سلسلة وكيل المستخدم بالضبط التي ستعودها WebView ، ولكن قد تخدمك جيدًا بما يكفي لأغراضك.

كميزة إضافية للسحب من عرض الويب ، يمكنك استخدام هذا من أي مؤشر ترابط (وليس فقط مؤشر ترابط واجهة المستخدم).

هناك خاصية نظام تسمى http.agent ، والتي يمكن استخدامها لاسترداد سلسلة وكيل المستخدم.

String userAgent = System.getProperty("http.agent");

يرى احصل برمجيًا على سلسلة وكيل المستخدم لمزيد من التفاصيل.

اعتدت على استخدام المحلول اقترح ديراجان. ولكن اتضح أن إنشاء واحد WebView يبدأ المثيل مؤشر ترابط "WebViewCorethRead" الذي يبقى على الخلفية حتى يتم إنهاء التطبيق بواسطة النظام. ربما لا تستهلك الكثير من الموارد ولكني لا أحب ذلك على أي حال. لذلك أستخدم طريقة مختلفة قليلاً الآن ، والتي تحاول تجنب إنشاء WebViewCorethRead:

// You may uncomment next line if using Android Annotations library, otherwise just be sure to run it in on the UI thread
// @UiThread 
public static String getDefaultUserAgentString(Context context) {
  if (Build.VERSION.SDK_INT >= 17) {
    return NewApiWrapper.getDefaultUserAgent(context);
  }

  try {
    Constructor<WebSettings> constructor = WebSettings.class.getDeclaredConstructor(Context.class, WebView.class);
    constructor.setAccessible(true);
    try {
      WebSettings settings = constructor.newInstance(context, null);
      return settings.getUserAgentString();
    } finally {
      constructor.setAccessible(false);
    }
  } catch (Exception e) {
    return new WebView(context).getSettings().getUserAgentString();
  }
}

@TargetApi(17)
static class NewApiWrapper {
  static String getDefaultUserAgent(Context context) {
    return WebSettings.getDefaultUserAgent(context);
  }
}

يخلق WebSettings مثيل مباشرة باستخدام مُنشئ مرئي الحزمة وإذا لم يكن ذلك متاحًا لسبب ما (على سبيل المثال ، بسبب تغييرات API في إصدارات Android المستقبلية)-يعود بصمت إلى حل "WebView-Like".

تحديث

كما أشار من قبل @Skywalker5446, ، بدءًا من Android 4.2/API 17 ، هناك طريقة ثابتة عامة للحصول على قيمة وكيل المستخدم الافتراضية. لقد قمت بتحديث الكود الخاص بي لاستخدام هذه الطريقة على المنصات المدعومة.

منذ Android 2.1 يجب استخدامك System.getProperty ("http.agent") ؛

أنت أيضًا لا تحتاج إلى إنشاء عرض ويب أولاً ، وهذا هو الميزة ، يمكنك استخدامه داخل غير متوفرة.

تحياتي ستيف

بفضل إجابة Idolon ، يمكن لتطبيقتي معالجة هذا في الخلفية.

لكن بطريقة ما على HTC ، ألهم 4G من AT&T الذي يعمل 2.3.3 ، يذهب إلى بيان الصيد ولا يمكن تشغيله على موضوع الخلفية. حلي لهذا هو ما يلي:

public static String getUserAgent(Context context) {
    try {
        Constructor<WebSettings> constructor = WebSettings.class.getDeclaredConstructor(Context.class, WebView.class);
        constructor.setAccessible(true);
        try {
            WebSettings settings = constructor.newInstance(context, null);
            return settings.getUserAgentString();
        } finally {
            constructor.setAccessible(false);
        }
    } catch (Exception e) {
        String ua;
        if(Thread.currentThread().getName().equalsIgnoreCase("main")){
            WebView m_webview = new WebView(context);
            ua = m_webview.getSettings().getUserAgentString();
        }else{
            mContext = context;
            ((Activity) mContext).runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    WebView webview = new WebView(mContext);
                    mUserAgent = webview.getSettings().getUserAgentString();
                }

            });
            return mUserAgent;
        }
        return ua;
    }
}

(لنفترض أن لديك Mcontext و Museragent في هذا المجال)

هذا هو الحل المحدث استنادًا إلى الإجابات السابقة التي تعمل عند ترجمة KitKat. الآن WebSettings الفصل مجردة و WebSettingsClassic تمت إزالة الفصل.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public static String getUserAgent(final Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        return WebSettings.getDefaultUserAgent(context);
    }
    else {
        try {
            final Class<?> webSettingsClassicClass = Class.forName("android.webkit.WebSettingsClassic");
            final Constructor<?> constructor = webSettingsClassicClass.getDeclaredConstructor(Context.class, Class.forName("android.webkit.WebViewClassic"));
            constructor.setAccessible(true);
            final Method method = webSettingsClassicClass.getMethod("getUserAgentString");
            return (String) method.invoke(constructor.newInstance(context, null));
        }
        catch (final Exception e) {
            return new WebView(context).getSettings()
                    .getUserAgentString();
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top