2011-11-28 11 views
5

ho il seguente codice per visualizzare un file video ospitato da remoto:Intent.ACTION_VIEW URL di un video non funzionante su Ice Cream Sandwhich

startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(article.getLink()))); 

dove getLink() restituisce l'URL del video associato con l'articolo.

Questo approccio ha funzionato correttamente sui dispositivi fino a Gingerbread, ma di recente ho testato l'app su ICS e ho riscontrato un problema. Il browser ICS inizia a caricare l'URL e io lo vedo nella barra di navigazione, ma quasi immediatamente il browser si chiude e sono riportato all'attività della mia app.

sto ottenendo il seguente analisi dello stack quando succede:

11-28 10:24:44.488: E/SurfaceTexture(116): [com.mypackage.myapp/com.mypackage.myapp.MyVideoActivity] connect: already connected (cur=2, req=2) 
11-28 10:24:44.488: E/ViewRootImpl(25384): IllegalArgumentException locking surface 
11-28 10:24:44.488: E/ViewRootImpl(25384): java.lang.IllegalArgumentException 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.view.Surface.lockCanvasNative(Native Method) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.view.Surface.lockCanvas(Surface.java:76) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.view.ViewRootImpl.draw(ViewRootImpl.java:1924) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1613) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.os.Looper.loop(Looper.java:137) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at android.app.ActivityThread.main(ActivityThread.java:4340) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at java.lang.reflect.Method.invokeNative(Native Method) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at java.lang.reflect.Method.invoke(Method.java:511) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
11-28 10:24:44.488: E/ViewRootImpl(25384): at dalvik.system.NativeStart.main(Native Method) 

Qualcun altro ha visto questo comportamento/conoscenza di una correzione?

risposta

5

ho provato un paio di cose e ho trovato l'impostazione in modo esplicito il tipo di dati dei dati all'interno dell'opera intento.

Intent videoIntent =new Intent(Intent.ACTION_VIEW); 
videoIntent.setDataAndType(Uri.parse(article.getLink()), "video/*"); 
startActivity(videoIntent); 

Nota: ho anche riscontrato un errore simile in Gingerbread 2.3.6.

+0

Non funziona su Samsung Galaxy Tab 2 con ICS in esecuzione. :( –

0

Non visto, ma una soluzione potrebbe essere quella di invocare esplicitamente l'applicazione di YouTube (se installata) piuttosto che lasciare che sia il browser a gestirla.

/** 
* @param context 
* @param url To display, such as http://www.youtube.com/watch?v=t_c6K1AnxAU 
* @return an Intent to start the YouTube Viewer. If it is not found, will 
*   return a generic video-play intent, and system will display a 
*   chooser to ther user. 
*/ 
public static Intent getYouTubeIntent(Context context, String url) { 
    Intent videoIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
    final PackageManager pm = context.getPackageManager(); 
    List<ResolveInfo> activityList = pm.queryIntentActivities(videoIntent, 0); 
    for (int i = 0; i < activityList.size(); i++) { 
    ResolveInfo app = activityList.get(i); 
    if (app.activityInfo.name.contains("youtube")) { 
     videoIntent.setClassName(app.activityInfo.packageName, app.activityInfo.name); 
     return videoIntent; 
    } 
    } 
    return videoIntent; 
} 

Codice da @Guy ->https://stackoverflow.com/a/6674637/31751

+0

Grazie Scott, ci provo ad un certo punto oggi! –

Problemi correlati