Câu hỏi Làm cách nào để mở URL trong trình duyệt web của Android từ ứng dụng của tôi?


Làm thế nào để mở một URL từ mã trong trình duyệt web tích hợp hơn là trong ứng dụng của tôi?

Tôi đã thử điều này:

try {
    Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(download_link));
    startActivity(myIntent);
} catch (ActivityNotFoundException e) {
    Toast.makeText(this, "No application can handle this request."
        + " Please install a webbrowser",  Toast.LENGTH_LONG).show();
    e.printStackTrace();
}

nhưng tôi có ngoại lệ:

No activity found to handle Intent{action=android.intent.action.VIEW data =www.google.com

1073
2018-02-04 17:51


gốc


Tôi nghĩ đó là vì điều này: android-developers.blogspot.com/2009/12/… - Arutha
Tại sao điều này không hoạt động trong một số thiết bị? ngay cả khi có một trình duyệt web, nó đi đến ActivityNotFoundException.
Tôi thấy cùng một vấn đề với @Manu. Cài đặt cơ bản trên Nexus 6, có chrome, nhưng các liên kết gây ra ngoại lệ. - Brill Pappin


Các câu trả lời:


Thử cái này:

Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
startActivity(browserIntent);

Điều đó làm việc tốt cho tôi.

Đối với các thiếu "http: //" Tôi chỉ cần làm một cái gì đó như thế này:

if (!url.startsWith("http://") && !url.startsWith("https://"))
   url = "http://" + url;

Tôi cũng có thể điền trước EditText của bạn mà người dùng đang nhập URL bằng "http: //".


2037
2018-02-04 18:01



Ngoại trừ mã và mbaird của bạn không giống nhau, từ những gì tôi có thể nói cho những gì được đăng. Đảm bảo rằng URL của bạn có http://lược đồ - ngoại lệ được hiển thị cho thấy rằng URL của bạn thiếu lược đồ. - CommonsWare
Vâng ! Nó bị mất http: //! URL được nhập bởi người dùng, có cách nào để tự động định dạng không? - Arutha
URLUtil là một cách tuyệt vời để kiểm tra người dùng đã nhập "url" Strings - Dan
if (!url.startsWith("http://") && !url.startsWith("https://")) là một lỗi phổ biến có thể dẫn bạn đến các url như tập tin:// và phá vỡ một số giai đoạn tốt. Hãy thử phân tích cú pháp uri với lớp URI và kiểm tra có một lược đồ không. Nếu không, hãy thêm "http: //";) - tuxSlayer
Bạn cần kiểm tra null với resolveCheck. Xem tài liệu chính thức : Thận trọng: Nếu không có ứng dụng nào trên thiết bị có thể nhận được ý định ngầm, ứng dụng của bạn sẽ gặp sự cố khi nó gọi hàm startActivity (). Trước tiên, để xác minh rằng một ứng dụng tồn tại để nhận được ý định, hãy gọi resolveActivity () trên đối tượng Intent của bạn. - phi


một cách phổ biến để đạt được điều này là với mã tiếp theo:

String url = "http://www.stackoverflow.com";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url)); 
startActivity(i); 

có thể thay đổi thành phiên bản mã ngắn ...

Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://www.stackoverflow.com"));      
startActivity(intent); 

hoặc là :

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.stackoverflow.com")); 
startActivity(intent);

ngắn nhất! :

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.stackoverflow.com")));

mã hóa hạnh phúc!


60
2018-05-27 14:20





Trong 2.3, tôi đã may mắn hơn với

final Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url));
activity.startActivity(intent);

Sự khác biệt là việc sử dụng Intent.ACTION_VIEW thay vì chuỗi "android.intent.action.VIEW"


47
2018-03-16 15:35



waht là khác nhau? - user1324936
Câu trả lời này đã giúp tôi vô cùng. Tôi không biết sự khác biệt là gì, nhưng chúng tôi đã có một vấn đề với 2,3 rằng điều này được giải quyết. Có ai biết sự khác biệt trong việc thực hiện là gì? - Innova
Theo nhà phát triển Android: câu trả lời này - "Tạo ra một ý định với một hành động nhất định. Tất cả các trường khác (dữ liệu, loại, lớp) là null." và câu trả lời được chấp nhận - "Tạo ý định với một hành động cụ thể và cho một url dữ liệu nhất định." - Teo Inke


Câu trả lời đơn giản

Bạn có thể thấy mẫu chính thức từ Nhà phát triển Android.

/**
 * Open a web page of a specified URL
 *
 * @param url URL to open
 */
public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Làm thế nào nó hoạt động

Vui lòng xem xét hàm tạo của Intent:

public Intent (String action, Uri uri)

Bạn có thể vượt qua android.net.Uri Ví dụ về tham số thứ 2 và một Intent mới được tạo dựa trên url dữ liệu đã cho.

Và sau đó, chỉ cần gọi startActivity(Intent intent) để bắt đầu một Hoạt động mới, được đi kèm với Mục đích với URL đã cho.

Tôi có cần if kiểm tra tuyên bố?

Vâng. Các tài liệu nói:

Nếu không có ứng dụng nào trên thiết bị có thể nhận được ý định ngầm, ứng dụng của bạn sẽ gặp sự cố khi nó gọi hàm startActivity (). Trước tiên, để xác minh rằng một ứng dụng tồn tại để nhận được ý định, hãy gọi resolveActivity () trên đối tượng Intent của bạn. Nếu kết quả là không null, có ít nhất một ứng dụng có thể xử lý ý định và an toàn để gọi hàm startActivity (). Nếu kết quả là null, bạn không nên sử dụng ý định và, nếu có thể, bạn nên vô hiệu hóa tính năng gọi ra mục đích.

Tiền thưởng

Bạn có thể viết trong một dòng khi tạo cá thể Intent như dưới đây:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

36
2017-08-24 05:06



Điều này giả định rằng url được cung cấp có http trong đó. - Igor Ganapolsky


Thử cái này:

Uri uri = Uri.parse("https://www.google.com");
startActivity(new Intent(Intent.ACTION_VIEW, uri));

hoặc nếu bạn muốn sau đó trình duyệt web mở trong hoạt động của bạn sau đó làm như thế này:

WebView webView = (WebView) findViewById(R.id.webView1);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
webView.loadUrl(URL);

và nếu bạn muốn sử dụng điều khiển thu phóng trong trình duyệt của mình thì bạn có thể sử dụng:

settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);

24
2017-08-31 10:10



Lưu ý rằng các plugin và như vậy bị vô hiệu hóa trong WebView, và rằng các điều khoản INTERNET sẽ được yêu cầu. (tài liệu tham khảo) - Keelan


Nếu bạn muốn hiển thị cho người dùng một cuộc hội thoại với tất cả danh sách trình duyệt, vì vậy anh ấy có thể chọn được ưa thích, đây là mã mẫu:

private static final String HTTPS = "https://";
private static final String HTTP = "http://";

public static void openBrowser(final Context context, String url) {

     if (!url.startsWith(HTTP) && !url.startsWith(HTTPS)) {
            url = HTTP + url;
     }

     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
     context.startActivity(Intent.createChooser(intent, "Choose browser"));// Choose browser is arbitrary :)

}

20
2018-01-09 08:55



nếu có nhiều ứng dụng có thể xử lý mục đích, hệ thống sẽ tự động cung cấp cho người chọn, đúng không? - Jeffrey Blattman
điểm tạo ra các trường HTTP và HTTPS là gì? - xmen
@ xmen-w-k vì url có thể bắt đầu ête với http hoặc là httpsvà trong java nó là một thực hành tốt để khai báo 'chuỗi ma thuật' như hằng số. - Dmytro Danylyk
@JeffreyBlattman yes (2 năm sau ^^) - Erdal G.
thx, không biết về context.startActivity. Rất hữu ích khi gọi nó từ một lớp bên ngoài - WuerfelDev


Cũng giống như các giải pháp khác đã viết (mà làm việc tốt), tôi muốn trả lời cùng một điều, nhưng với một mẹo mà tôi nghĩ rằng hầu hết sẽ thích sử dụng.

Trong trường hợp bạn muốn ứng dụng bạn bắt đầu mở trong một nhiệm vụ mới, độc lập của riêng bạn, thay vì ở trên cùng một ngăn xếp, bạn có thể sử dụng mã này:

final Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);

15
2018-04-08 09:19



Việc tạo một nhiệm vụ mới sẽ bảo vệ ứng dụng nguồn khỏi lỗi và sự cố, trong trường hợp trình duyệt web gặp sự cố? - The Original Android
@ TheOriginalAndroid Tôi không hiểu những gì nó đã làm với tai nạn và trình duyệt web. Hãy giải thích những gì bạn đang cố gắng làm. - android developer
Cám ơn phản hồi của bạn. Bài đăng của bạn thú vị. Lợi ích của việc mở một nhiệm vụ mới đặc biệt là khi khởi chạy web là gì? - The Original Android
@TheOriginalAndroid Chỉ cần để người dùng có thể chuyển về ứng dụng của bạn và sau đó quay lại trình duyệt web. Nếu bạn mở màn hình nhiệm vụ gần đây, bạn sẽ thấy 2 tác vụ ở đây thay vì một tác vụ. Ngoài ra, thay vì nhìn thấy hình thu nhỏ của trình duyệt web trong một tác vụ duy nhất (thuộc về nhiệm vụ của ứng dụng của bạn), bạn sẽ thấy 2: một trong các ứng dụng của bạn và một ứng dụng khác của trình duyệt web. Tôi nghĩ rằng nó ít gây nhầm lẫn theo cách này. - android developer


tùy chọn khác Trong Url tải trong cùng một ứng dụng bằng cách sử dụng Webview

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl("http://www.google.com");

14
2018-06-25 08:01



Lưu ý rằng các plugin và như vậy bị vô hiệu hóa trong WebView, và rằng các điều khoản INTERNET sẽ được yêu cầu. (tài liệu tham khảo) - Keelan


Bạn cũng có thể đi theo cách này

Trong xml:

<?xml version="1.0" encoding="utf-8"?>
<WebView  
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

Trong mã java:

public class WebViewActivity extends Activity {

private WebView webView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webview);

    webView = (WebView) findViewById(R.id.webView1);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.loadUrl("http://www.google.com");

 }

}

Trong Manifest không quên thêm quyền truy cập internet ...


10
2017-12-19 06:04



Điều này thật thú vị và khác biệt. Tôi đoán theo cách này, người dùng sẽ thấy trình duyệt web trong ứng dụng của tôi. Có đúng không? Tôi upvote. - The Original Android