ไม่พบกิจกรรมที่จะจัดการกับเจตนา: android.intent.action.VIEW


101

นี่คือรหัสของฉันเพื่อเล่นไฟล์เสียง 3gp ที่บันทึกไว้

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

แต่ในขณะที่เรียกใช้ในอุปกรณ์ HTC ของฉัน (Android 2.2 Froyo) แสดงข้อยกเว้น:

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)

ในแท็บเล็ต Galaxy ใช้งานได้ดี ฉันจะแก้ไขปัญหานี้ได้อย่างไร


1
เป็นเพราะไฟล์ของคุณเป็น. 3gp และคุณบอกให้ระบบเล่นข้อมูลที่เป็น mp3 หรือไม่?
Blundell

@Blundell ฉันลอง 3gp bt แล้วยังมีข้อยกเว้นถูกโยน
เจนนิเฟอร์

คำตอบ:


157

ที่อยู่ URL ต้องนำหน้าด้วย http: //

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

พ่น ActivityNotFoundException หากคุณนำหน้า "http: //" แสดงว่าปัญหาได้รับการแก้ไขแล้ว

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

อาจไม่ช่วย OP แต่สุดท้ายแล้วฉันก็ค้นหาข้อยกเว้นเดียวกันและอาจช่วยคนอื่นได้


8
สุดยอด! โครงการนี้เป็นสิ่งที่ต้องทำ file://หายไปในกรณีของฉันจนกว่าฉันUri.parse()จะเปลี่ยนเป็นUri.fromFile().
สแตน

@Stan thanx สำหรับการแก้ปัญหา
Serg Burlaka

ฉันได้รับปัญหาเมื่อมีการเข้ารหัส url ดังนั้นโปรดทราบว่าคุณอาจต้องทำUri.parse(Uri.decode(encodedString))
hmac

44

หากคุณได้รับข้อผิดพลาดนี้เมื่อพยายามเปิดหน้าเว็บจากแอป Android ของคุณนั่นเป็นเพราะ URL ของคุณมีลักษณะดังนี้:

www.google.com

แทน: https://www.google.comหรือhttp://www.google.com

เพิ่มรหัสนี้ในกิจกรรม / ส่วนของคุณ:

 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);
    }
}

เพียงแค่ผ่าน URL openWebPage()ของคุณไป หากมีคำนำหน้าอยู่แล้วhttps://หรือแสดงhttp://ว่าคุณดีไปแล้วมิฉะนั้นคำสั่ง if จะจัดการสิ่งนั้นให้คุณ


34

นี่คือวิธีที่เหมาะสมที่จะทำ

    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();
    }

คุณต้องนำเข้านำเข้า android.webkit.MimeTypeMap;


นี่เป็นหนทางที่ยาวไกล: d
umerk44

1
การห่อรหัสจำนวนมากในบล็อกลองโดยมีข้อยกเว้นทั่วไปมักไม่ใช่ความคิดที่ดี พฤติกรรมที่นี่ไม่ได้กำหนดไว้ทั้งหมด - คุณสามารถบอกได้ไหมว่าอินพุตใดจะพิมพ์ข้อความได้อย่างรวดเร็ว? จะมีข้อยกเว้นอะไรเกิดขึ้นและทำไม? นี่เป็นสัญญาณของรหัสที่ไม่ได้รับการทดสอบอย่างละเอียด
jbass

20

สำหรับฉันเมื่อพยายามเปิดลิงค์:

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

ฉันได้รับข้อผิดพลาดเดียวกัน android.content.ActivityNotFoundException: No Activity found to handle Intent

ปัญหาเกิดจากฉันไม่มีแอพที่สามารถเปิด URL (เช่นเบราว์เซอร์) ที่ติดตั้งในโทรศัพท์ของฉัน ดังนั้นหลังจากติดตั้งเบราว์เซอร์ปัญหาได้รับการแก้ไข

* บทเรียน: ตรวจสอบให้แน่ใจว่ามีอย่างน้อยหนึ่งแอพที่จัดการกับเจตนาที่คุณกำลังโทรหา *


6
แล้วเราจะรับมือกับสถานการณ์นี้อย่างไร?
Nikhil

หากไม่มีอุปกรณ์ทดสอบที่กำหนดเองด้วย ROM ที่กำหนดเองคุณจะมีกิจกรรมทางอินเทอร์เน็ต นี่ฟังดูไม่ถูกเลย
StarWind0

ฉันมีปัญหาเดียวกันกับที่ลูกค้ารายงาน ดูเหมือนว่ามีอุปกรณ์บางอย่างที่ไม่ได้ติดตั้งอินเทอร์เน็ตเบราว์เซอร์เริ่มต้นไว้ วิธีแก้ปัญหานี้
Abhijit

ตรวจจับข้อผิดพลาดและให้ข้อมูล / โต้ตอบ / ขนมปังว่าพวกเขาไม่มีเบราว์เซอร์ที่ใช้งานได้หรือไม่?
erluxman

1
ดูวิธีการแก้ปัญหาstackoverflow.com/questions/22479211/... ในกรณีนี้คุณจะทราบได้ว่าอุปกรณ์มีเบราว์เซอร์เริ่มต้น (หรือแอปพลิเคชันที่ประมวลผล Deep Link) หรือไม่
CoolMind

18

คำตอบโดย Maragues ทำให้ฉันตรวจสอบเอาต์พุต logcat ปรากฏว่าเส้นทางที่คุณผ่านไปยัง Uri จะต้องขึ้นต้นด้วย
file:/

เนื่องจากเป็นเส้นทางในเครื่องไปยังพื้นที่เก็บข้อมูลของคุณ

คุณอาจต้องการดูเส้นทางด้วยเช่นกัน

`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 }`

จุดยึดดูเหมือนจะปรากฏขึ้นสองครั้งในเส้นทางแบบเต็ม


ดูเหมือนจะเป็นคำตอบที่ถูกต้อง แต่คำถามเก่าและ OP ถูกพบครั้งสุดท้ายเมื่อเกือบ 2 เดือนที่แล้ว
Maragues

นี่คือสิ่งที่ฉันทำ น่าเศร้าที่ฉันอ่านคำตอบนี้หลังจากพบคำตอบเท่านั้น :)
Janis Peisenieks

10

หากคุณไม่ส่ง URL ของเว็บที่ถูกต้องและไม่มีเบราว์เซอร์ ActivityNotFoundException จะเกิดขึ้นดังนั้นโปรดตรวจสอบข้อกำหนดเหล่านั้นหรือจัดการข้อยกเว้นอย่างชัดเจน ที่สามารถแก้ไขปัญหาของคุณ

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

ฉันมีปัญหาเดียวกันนี้ดังนั้นฉันจึงดูเจตนาที่บันทึกไว้ใน LogCat เมื่อดูวิดีโอจากแกลเลอรีวิดีโอจะเรียก Intent.View เดียวกัน แต่ตั้งค่าประเภทเป็น "เสียง / *" ซึ่งแก้ไขปัญหาของฉันและไม่ต้องนำเข้า MimeTypeMap ตัวอย่าง:

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

1
ยังใช้ได้กับวิดีโอเมื่อใช้Intent.setDataAndType (data, "video / *") ;
Nestor

3

หากข้อยกเว้นนี้เปลี่ยนเป็น

"เสียง / *"

แต่ขอบคุณที่@Stanฉันเปลี่ยนวิธีง่ายๆ แต่มีประโยชน์:

Uri.fromFile(File(content)) แทน Uri.parse(path)

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

หวังว่ามันจะช่วยใครสักคนในการแก้ไขปัญหาของเขา


3

หากคุณมีข้อผิดพลาดเหล่านี้ใน logcat ของคุณให้ใช้รหัสเหล่านี้เพื่อช่วยฉัน

 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());
            }

ด้วย

   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

ก่อนอื่นให้ลองใช้รหัสนี้ในAndroidManifest

  <application>

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

หากรหัสนี้ใช้งานได้ดี แต่ถ้าไม่. ลองใช้รหัสนี้จากคลาสที่คุณต้องการส่งผ่านข้อมูลหรือ uri

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

หวังว่านี่จะช่วยแก้ปัญหาของคุณได้ ขอบคุณ


1

ฉันมีสองความคิด:

ขั้นแรก: หากคุณต้องการเล่นไฟล์ 3gp คุณควรใช้ประเภท mime "audio / 3gpp" หรือ "audio / mpeg"

และครั้งที่สอง: คุณสามารถลองใช้วิธีsetData(data)สำหรับการintentได้โดยไม่ต้องชนิดไมม์ใด ๆ

หวังว่านี่จะช่วยได้


ยังคงเป็นข้อยกเว้น 05-04 17: 30: 30.022: WARN / System.err (4937): android.content.ActivityNotFoundException: ไม่พบกิจกรรมที่จัดการกับเจตนา {act = android.intent.action.VIEW dat = / mnt / sdcard / audio-android.3gp} กำลังฉาย
jennifer

Android รองรับไฟล์ 3gp ของคุณหรือไม่ developer.android.com/guide/appendix/media-formats.html
Pasha

1

ข้อยกเว้นนี้สามารถเพิ่มขึ้นเมื่อคุณจัดการDeep linkingหรือ URL สำหรับเบราว์เซอร์หากไม่มีการติดตั้งค่าเริ่มต้น ในกรณีของการลิงก์ในรายละเอียดอาจไม่มีการติดตั้งแอปพลิเคชันที่สามารถประมวลผลลิงก์ในรูปแบบmyapp://mylinkได้

คุณสามารถใช้โซลูชันส้มเขียวหวานสำหรับ API ได้ถึง 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()
    }
}

สำหรับ API> = 30 เห็นผลตอบแทน intent.resolveActivity โมฆะใน API 30


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.