Không tìm thấy Hoạt động nào để xử lý Intent: android.intent.action.VIEW


97

Đây là mã của tôi để phát tệp 3gp âm thanh đã ghi

 Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
        Uri data = Uri.parse(path);
        intent.setDataAndType(data, "audio/mp3");
        startActivity(intent);

Nhưng trong khi chạy nó trong thiết bị HTC của tôi (Android 2.2 Froyo) cho thấy một ngoại lệ:

05-04 16:37:37.597: WARN/System.err(4065): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }
05-04 16:37:37.597: WARN/System.err(4065):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1567)
05-04 16:37:37.597: INFO/ActivityManager(92): Starting activity: Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1537)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Activity.startActivityForResult(Activity.java:2858)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.Activity.startActivity(Activity.java:2964)
05-04 16:37:37.607: WARN/System.err(4065):     at com.ey.camera.AudioRecorder.playAudio(AudioRecorder.java:244)
05-04 16:37:37.607: WARN/System.err(4065):     at com.ey.camera.AudioRecorder$4.onClick(AudioRecorder.java:225)
05-04 16:37:37.607: WARN/System.err(4065):     at android.view.View.performClick(View.java:2408)
05-04 16:37:37.607: WARN/System.err(4065):     at android.view.View$PerformClick.run(View.java:8817)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Handler.handleCallback(Handler.java:587)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-04 16:37:37.607: WARN/System.err(4065):     at android.os.Looper.loop(Looper.java:144)
05-04 16:37:37.607: WARN/System.err(4065):     at android.app.ActivityThread.main(ActivityThread.java:4937)
05-04 16:37:37.607: WARN/System.err(4065):     at java.lang.reflect.Method.invokeNative(Native Method)
05-04 16:37:37.607: WARN/System.err(4065):     at java.lang.reflect.Method.invoke(Method.java:521)
05-04 16:37:37.607: WARN/System.err(4065):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-04 16:37:37.607: WARN/System.err(4065):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-04 16:37:37.607: WARN/System.err(4065):     at dalvik.system.NativeStart.main(Native Method)

Trong máy tính bảng Galaxy, nó hoạt động tốt. Tôi có thể giải quyết vấn đề này như thế nào?


1
Có phải vì tệp của bạn là .3gp và bạn yêu cầu hệ thống phát dữ liệu là mp3?
Blundell

@Blundell tôi đã thử với 3gp bt vẫn có ngoại lệ bị ném
jennifer

Câu trả lời:


154

Địa chỉ url phải được đặt trước http: //

Uri uri = Uri.parse("www.google.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);

ném một ActivityNotFoundException. Nếu bạn thêm "http: //", vấn đề đã được giải quyết.

Uri uri = Uri.parse("http://www.google.com");

Có thể không giúp OP, nhưng tôi đã kết thúc ở đây để tìm kiếm ngoại lệ tương tự và có thể nó giúp những người khác.


8
Tuyệt vời! Đề án là phải. file://đã mất tích trong trường hợp của tôi cho đến khi tôi đổi Uri.parse()thành Uri.fromFile().
Stan

@Stan thanx cho giải pháp
Serg Burlaka

Tôi đã nhận được một vấn đề khi các url được mã hóa, vì vậy lưu ý bạn có thể cần phải làmUri.parse(Uri.decode(encodedString))
HMAC

40

Nếu bạn cũng gặp phải lỗi này khi cố gắng mở một trang web từ ứng dụng Android của mình thì đó là do url của bạn trông giống như sau:

www.google.com

thay vì: https://www.google.comhoặchttp://www.google.com

thêm mã này vào Hoạt động / Phân đoạn của bạn:

 public void openWebPage(String url) {

    Uri webpage = Uri.parse(url);

    if (!url.startsWith("http://") && !url.startsWith("https://")) {
        webpage = Uri.parse("http://" + url);
    }

    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

chỉ cần chuyển url của bạn tới openWebPage(). Nếu nó đã được bắt đầu bằng https://hoặc http://thì bạn đã sẵn sàng , nếu không câu lệnh if sẽ xử lý điều đó cho bạn


34

Đây là cách làm đúng.

    try
    {
    Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW);
    File file = new File(aFile.getAbsolutePath()); 
    String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString());
    String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
    myIntent.setDataAndType(Uri.fromFile(file),mimetype);
    startActivity(myIntent);
    }
    catch (Exception e) 
    {
        // TODO: handle exception
        String data = e.getMessage();
    }

bạn cần nhập import android.webkit.MimeTypeMap;


đây là chặng đường dài để làm điều đó: d
umerk44

1
Gói nhiều mã đó trong một khối thử với ngoại lệ chung thường không phải là một ý kiến ​​hay. Hành vi ở đây là hoàn toàn không được xác định - bạn có thể biết đầu vào nào sẽ in một tin nhắn trong nháy mắt không? Những ngoại lệ nào sẽ phát sinh, và tại sao? Đây là dấu hiệu của mã chưa được kiểm tra kỹ lưỡng.
jbass

19

Đối với tôi khi cố gắng mở một liên kết:

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

Tôi cũng mắc lỗi tương tự android.content.ActivityNotFoundException: No Activity found to handle Intent

Vấn đề là do tôi không có bất kỳ ứng dụng nào có thể mở URL (tức là trình duyệt) được cài đặt trong điện thoại của mình. Vì vậy, sau khi Cài đặt trình duyệt, vấn đề đã được giải quyết.

* Bài học: Đảm bảo có ít nhất một ứng dụng xử lý ý định bạn đang gọi *


6
Vậy chúng ta có thể xử lý tình huống này như thế nào?
Nikhil

mà không có thiết bị kiểm tra tùy chỉnh với ROM tùy chỉnh, bạn sẽ có hoạt động internet. Điều này nghe có vẻ không ổn chút nào.
StarWind0

Tôi đang gặp vấn đề tương tự khi được một khách hàng báo cáo. Vì vậy, có vẻ như có một số thiết bị không được cài đặt trình duyệt Internet mặc định. Làm thế nào để giải quyết điều này?
Abhijit

Bắt lỗi và đưa ra thông tin / hộp thoại / bánh mì nướng rằng họ không có trình duyệt hoạt động?
erluxman

1
Xem giải pháp stackoverflow.com/questions/22479211/… . Trong trường hợp này, bạn sẽ biết liệu thiết bị có chứa trình duyệt mặc định (hoặc ứng dụng xử lý liên kết sâu) hay không.
CoolMind

17

Câu trả lời của Maragues khiến tôi kiểm tra đầu ra logcat. Có vẻ như đường dẫn bạn đi đến Uri cần phải có tiền tố
file:/

Vì nó là một đường dẫn cục bộ đến bộ nhớ của bạn.

Bạn cũng có thể muốn nhìn vào chính con đường đó.

`05-04 16:37:37.597: WARN/System.err(4065): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=/mnt/sdcard/mnt/sdcard/audio-android.3gp typ=audio/mp3 }`

Điểm gắn kết dường như xuất hiện hai lần trong đường dẫn đầy đủ.


này có vẻ là câu trả lời đúng, nhưng vấn đề là cũ và OP đã được nhìn thấy lần cuối gần 2 tháng trước
Maragues

Đây là những gì tôi đã làm. Đáng buồn thay, tôi chỉ đọc câu trả lời này sau khi tôi tìm thấy những giải pháp :)
Janis Peisenieks

10

Nếu bạn không chuyển đúng URL web và không có trình duyệt, ActivityNotFoundException sẽ xảy ra, vì vậy hãy kiểm tra các yêu cầu đó hoặc xử lý ngoại lệ một cách rõ ràng. Điều đó có thể giải quyết vấn đề của bạn.

public static void openWebPage(Context context, String url) {
    try {
        if (!URLUtil.isValidUrl(url)) {
            Toast.makeText(context, " This is not a valid link", Toast.LENGTH_LONG).show();   
        } else {
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setData(Uri.parse(url));
            context.startActivity(intent);
        }
    } catch (ActivityNotFoundException e) {
        Toast.makeText(context, " You don't have any browser to open web page", Toast.LENGTH_LONG).show();
    }
}


3

Tôi đã gặp vấn đề tương tự, vì vậy tôi đang xem xét mục đích được đăng nhập vào LogCat. Khi xem video từ Thư viện, nó được gọi là cùng một mục đích Intent.View, nhưng đặt Loại thành "âm thanh / *", điều này đã khắc phục sự cố của tôi và không yêu cầu nhập MimeTypeMap. Thí dụ:

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
Uri data = Uri.parse(path);
intent.setDataAndType(data, "audio/*");
startActivity(intent);

1
Cũng hoạt động với video khi sử dụng ý định.setDataAndType (dữ liệu, "video / *") ;
Nestor

3

Đã có ngoại lệ này thậm chí được thay đổi thành

"âm thanh / *"

Nhưng thanx thành @Stan, tôi đã chuyển giải pháp rất đơn giản nhưng hữu ích:

Uri.fromFile(File(content)) thay thế Uri.parse(path)

 val intent =Intent(Intent.ACTION_VIEW)
                    intent.setDataAndType(Uri.fromFile(File(content)),"audio/*")
                    startActivity(intent)

Hy vọng nó sẽ giúp ai đó khắc phục sự cố của mình.


3

Nếu bạn gặp lỗi này trong logcat của mình thì hãy sử dụng mã này, nó sẽ giúp tôi

 Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(Uri.fromFile(new File(data.getLocation())), "audio/*");
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Log.d("error", e.getMessage());
            }

cũng thế

   Intent intent = new Intent(MediaStore.INTENT_ACTION_MUSIC_PLAYER);
            intent.setDataAndType(Uri.fromFile(new File(data.getLocation())), "audio/*");
            try {
                context.startActivity(intent);
            } catch (ActivityNotFoundException e) {
                Log.d("error", e.getMessage());
            }

2

Trước tiên, hãy thử mã này bên trong AndroidManifest

  <application>

    <uses-library
        android:name="org.apache.http.legacy"
        android:required="false" />
 </application>

Nếu mã này hoạt động, rất tốt. Nhưng nếu không. Hãy thử mã này từ lớp mà bạn muốn chuyển dữ liệu hoặc uri.

Intent window = new Intent(getApplicationContext(), Browser.class);
window.putExtra("LINK", "http://www.yourwebsite.com");
startActivity(window);

Hy vọng điều này sẽ giải quyết vấn đề của bạn. Cảm ơn bạn


1

Tôi có hai ý tưởng:

Đầu tiên: nếu bạn muốn phát tập tin 3gp, bạn nên sử dụng loại mime "audio / 3gpp" hoặc "audio / mpeg"

Và thứ hai: bạn có thể thử sử dụng phương pháp setData(data)cho intentmà không có bất kỳ loại kịch câm nào.

Hi vọng điêu nay co ich.


vẫn là ngoại lệ 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: Không tìm thấy Hoạt động nào để xử lý Intent {act = android.intent.action.VIEW dat = / mnt / sdcard / audio-android.3gp} đang chiếu
jennifer

Android có hỗ trợ tệp 3gp của bạn không? developer.android.com/guide/appcharge/media-formats.html
Pasha

1

Ngoại lệ này có thể tăng lên khi bạn xử lý Deep linkinghoặc URL cho một trình duyệt, nếu không có cài đặt mặc định. Trong trường hợp Liên kết sâu có thể không có ứng dụng nào được cài đặt có thể xử lý một liên kết ở định dạng myapp://mylink.

Bạn có thể sử dụng giải pháp quýt cho API tối đa 29:

private fun openUrl(url: String) {
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
    val activityInfo = intent.resolveActivityInfo(packageManager, intent.flags)
    if (activityInfo?.exported == true) {
        startActivity(intent)
    } else {
        Toast.makeText(
            this,
            "No application that can handle this link found",
            Toast.LENGTH_SHORT
        ).show()
    }
}

Đối với API> = 30, hãy xem ý định.resolveActivity trả về null trong API 30 .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.