2016-04-12 2 views
2

Ich habe versucht, meine lokalen Videos (Raw-Ordner) mit Intent.ActionView ausführen zu lassen. Wenn ich den Intent erstelle und Daten eintippe und dann starte, bekomme ich einen Fehler. Bitte beachten Sie den folgenden Code & Fehler.Warum Intent.ActionView einen Fehler mit einer MP4-Datei wirft

Ich habe eine Menge verschiedener Möglichkeiten ausprobiert, um zu der Datei zu kommen, die denkt, dass sie vielleicht nicht gefunden wird, aber ich denke nicht, dass das das Problem ist. Ich habe verschiedene Videoformate ausprobiert, aber ich glaube auch nicht, dass das das Problem ist.

Wenn ich eine URL zu einem MP4 in SetDataAndType verwenden, die ohne einen Fehler ausgeführt wird. Vielleicht ist das ein Zugriffsfehler? An diesem Punkt habe ich wirklich keine Ahnung. Ich hoffe, dass jemand das Problem, auf das ich hier stoße, erklären kann.

Code:

// Create the intent and push the mp4 to it, lets run a video! 
Intent videoIntent = new Intent (Intent.ActionView); 

// Video is MP4 format 
videoIntent.SetDataAndType (Uri.Parse ("android.resource://" + PackageName + "/raw/bunny"), "video/*"); 

// Crash here, Error: Android.Content.ActivityNotFoundExeception 
StartActivity (videoIntent); 

Fehler:

Android.Content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=android.resource://com.test.videotest/raw/bunny typ=video/* } 
     at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Users/builder/data/lanes/3053/a94a03b5/source/mono/external/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 
     at Android.Runtime.JNIEnv.CallNonvirtualVoidMethod (IntPtr jobject, IntPtr jclass, IntPtr jmethod, Android.Runtime.JValue* parms) [0x00084] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/src/Runtime/JNIEnv.g.cs:1029 
     at Android.Content.ContextWrapper.StartActivity (Android.Content.Intent intent) [0x00070] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Content.ContextWrapper.cs:3238 
     at VideoTest.MainActivity.<OnCreate>m__0 (System.Object , System.EventArgs) [0x00034] in /Users/alex/Projects/VideoTest/VideoTest/MainActivity.cs:33 
     at Android.Views.View+IOnClickListenerImplementor.OnClick (Android.Views.View v) [0x0000d] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Views.View.cs:1780 
     at Android.Views.View+IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (IntPtr jnienv, IntPtr native__this, IntPtr native_v) [0x00011] in /Users/builder/data/lanes/3053/a94a03b5/source/monodroid/src/Mono.Android/platforms/android-19/src/generated/Android.Views.View.cs:1745 
     at at (wrapper dynamic-method) System.Object:123eb72a-af75-42a8-b3aa-717e415176e4 (intptr,intptr,intptr) 
     at --- End of managed exception stack trace --- 
     at android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=android.resource://com.test.videotest/raw/bunny typ=video/* } 
     at at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1798) 
     at at android.app.Instrumentation.execStartActivity(Instrumentation.java:1512) 
     at at android.app.Activity.startActivityForResult(Activity.java:3930) 
     at at android.app.Activity.startActivityForResult(Activity.java:3890) 
     at at android.app.Activity.startActivity(Activity.java:4213) 
     at at android.app.Activity.startActivity(Activity.java:4181) 
     at at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method) 
     at at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:29) 
     at at android.view.View.performClick(View.java:5204) 
     at at android.view.View$PerformClick.run(View.java:21155) 
     at at android.os.Handler.handleCallback(Handler.java:739) 
     at at android.os.Handler.dispatchMessage(Handler.java:95) 
     at at android.os.Looper.loop(Looper.java:148) 
     at at android.app.ActivityThread.main(ActivityThread.java:5422) 
     at at java.lang.reflect.Method.invoke(Native Method) 
     at at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Hinweis:

Sie können dies leicht versuchen, sich folgendes mit:

  1. Crea te eine neue Xamarin Android App
  2. Kopieren Sie den obigen Code in die Schaltfläche klicken (Pre-made mit dem Projekt)
  3. Erstellen Sie einen rohen Ordner in "Ressourcen" und setzen Sie alle MP4-Datei (benennen Sie es oder benennen Sie das Video in der SetDataAndType)
  4. Führen Sie die Anwendung auf einem Gerät (Simulator nicht zu handhaben scheint dies so habe ich mein Nexus 5X)

Weiter mehr:

Mein Gerät verfügt sowohl über VLC Player und Google Fotos ins können beide MP4-Dateien abspielen. Und als Beweis, wenn ich die data zu einer URL ändere (Verbindung zu einer MP4-Datei), wird dies gut funktionieren.

Dies ist nicht eine Frage der Datei nicht gefunden, da ich den gleichen Pfad mit einem VideoView getestet habe und es funktioniert gut.

+0

Mögliche Duplikat von [Wie man Videos in Android aus Assets Ordner oder roher Ordner?] (http://stackoverflow.com/questions/3028717/how-to-play-videos-in-android-from-assets-folder-orraw-folder) – Jason

+0

@Jason Nicht relevant Ich habe Angst . Ich fürchte, das ist mehr ein Xamarin-Problem als alles andere. Die Datei wird gefunden, wenn ich andere Methoden als VideoView sicher verwende. – Ruddy

Antwort

1

Dies passiert, weil es in Ihrem Gerät oder Emulator keine App gibt, die mp4-Dateien verarbeiten kann.

Absturz vermeiden Sie so etwas wie dieses

PackageManager packageManager = getPackageManager(); 
if (intent.resolveActivity(packageManager) != null) { 
    // this intent can be handled 
    startActivity(intent); 
} else { 
    // no app found that can handle the intent 
    Toast.makeText(context, "No Intent available to handle action", Toast.LENGTH_LONG).show; 
} 
+0

Ich hätte dies auf die Frage gepostet. Auf meinem Gerät sind VLC und Google Fotos installiert. Beide können MP4 wiedergeben. Wie ich in meiner Frage gesagt habe, wenn ich die Daten in eine URL (eine MP4-Datei) ändere, wird es gut funktionieren. – Ruddy

+0

Irgendwelche anderen Ideen? – Ruddy

1

versuchen, dies denke, seine etwas todo damit nicht die uri finden richtig tun können:

videoIntent.SetDataAndType (Uri.FromFile (new File($"android.resource://{PackageName}/{Resource.Raw.bunny}")), "video/*"); 

diese dann öffnen mir die Wahl von Fotos gibt oder Videoplayer.

Aber ich denke, das verbirgt nur die Tatsache, dass es das Video laden kann, wie SushiHangover sagte.

Gibt es einen Grund, warum Sie eine ViewVideo in einer anderen Aktivität wie so verwenden können:

[Activity (Label = "VideoActivity")]   
public class VideoActivity : Activity 
{ 
     // Create your application here 
     VideoView videoView; 
     protected override void OnCreate (Bundle bundle) 
     { 
     base.OnCreate (bundle); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.VideoActivity); 
     videoView = FindViewById<VideoView> (Resource.Id.SampleVideoView); 
     videoView.SetMediaController(new MediaController(this)); 
     videoView.SetVideoPath ($"android.resource://{PackageName}/{Resource.Raw.bunny}"); 
     videoView.RequestFocus(); 
     videoView.Start(); 
    } 
} 

und das Layout

Die '$' am Anfang

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 


<VideoView 
    android:id="@+id/SampleVideoView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

</LinearLayout> 

EDIT ist aC# 6 String-Interpolation https://msdn.microsoft.com/en-GB/library/dn961160.aspx

In Bezug auf die Lösung, denke ich, dass eine Videodatei in den Raw-Ordner in der App bedeutet, dass es nicht in der Lage sein wird, es als im Verzeichnis der App zu spielen. Also die besten Optionen sind, entweder wie Sie das Video in einen spielbaren Ordner (Kopieren Sie es auf SD-Karte nicht ideal) oder das Video mit einem VideoView

+0

Das Problem mit 'Uri.Parse' ist, dass Sie ein" resource: // "Schema an eine Absicht übergeben, die es nicht verarbeiten kann. Wenn Sie' FromFile' verwenden, erhalten Sie ein 'file: //' Schema, das a ist Video-Referenz, dass Android OS eine Absicht für (oder mehrere in diesem Fall) finden kann – SushiHangover

+0

TBH das ist keine großartige Lösung denke, es wird Erlaubnissprobleme geben. Gibt es einen Grund, warum Sie die Datei nicht von einem VideoView abspielen können? –

+0

Ihre erste Zeile verursacht einen Fehler wegen '$' in 'neuer Datei ($'. Nicht sicher, was das '$' ist, wenn Sie erklären könnten, dass das großartig wäre. Der Grund, warum ich 'VideoView' nicht verwenden kann, ist es ist sehr unruhig mit Vollbild (Immersive-Modus). Auf Geräten ohne physische Tasten können Sie "Hardware-Tasten" auf dem Bildschirm. Bei der Verwendung der "VideoView" überlappen diese Tasten die Video-Steuerelemente (auf einigen Geräten) und andere, wenn Sie auf das Video klicken setzt die ui flags zurück, so dass es aus dem fullscreen immersiven Modus kommt – Ruddy