ภาพรวม
Mixed Content เกิดขึ้นเมื่อหน้าเว็บโหลดด้วย HTTPS แต่มีทรัพยากรบางส่วน (รูปภาพ สคริปต์ iframe) โหลดผ่าน HTTP แบบไม่ปลอดภ Android WebView บล็อก Mixed Content โดยค่าเริ่มต้น ต้องเปิดใช้งานอย่างชัดเจน
ขั้นตอนที่ 1-2: โปรเจกต์และ Layout
Layout ใช้ WebView แทน TextView:
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
ขั้นตอนที่ 3: โค้ด WebView Configuration
WebView webView = findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
// เปิดใช้งาน Mixed Content (API 21+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webView.getSettings().setMixedContentMode(
WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE
);
}
webView.loadUrl("https://www.tutorialspoint.com/");
โหมด Mixed Content ทั้ง 3 แบบ
| โหมด | ค่าคงที่ | พฤติกรรม |
|---|---|---|
| Never (Default) | MIXED_CONTENT_NEVER_ALLOW | บล็อก HTTP ทั้งหมดบนหน้า HTTPS |
| Compatibility | MIXED_CONTENT_COMPATIBILITY_MODE | อนุญาต HTTP สำหรับรูปภาพ/เสียง/วิดีโอ บล็อกสคริปต์/iframe |
| Always | MIXED_CONTENT_ALWAYS_ALLOW | อนุญาต HTTP ทุกประเภท (ไม่แนะนำ - ไม่ปลอดภัย) |
แนะนำ: ใช้ COMPATIBILITY_MODE
สมดุลระหว่างความปลอดภัยและความเข้ากันได้ เหมาะกับแอปที่ต้องแสดงเนื้อหาจากแหล่งเก่า
Manifest
<uses-permission android:name="android.permission.INTERNET"/>
ไม่ต้องการ READ_PHONE_STATE เพราะไม่เข้าถึงข้อมูลอุปกรณ์
ข้อควรระวัง
- Android 8.0+ (API 26) บล็อก Cleartext HTTP โดยค่าเริ่มต้น ต้องเพิ่ม
android:usesCleartextTraffic="true"ใน Application tag หรือใช้ Network Security Config - Google Play Policy ห้ามใช้ MIXED_CONTENT_ALWAYS_ALLOW ในแอปเผยแพร่