2010-08-10 18 views

Respuesta

21

Tuve este mismo problema.

Lamentablemente, no pude encontrar una manera de hacer aparecer las opciones de menú estándar del navegador. Tienes que implementar cada uno tú mismo. Lo que hice fue registrar el WebView para menús contextuales con activity.registerForContextMenu(webView). Entonces subclases la vista Web y hizo caso omiso de este método:

@Override 
protected void onCreateContextMenu(ContextMenu menu) { 
    super.onCreateContextMenu(menu); 

    HitTestResult result = getHitTestResult(); 

    MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() { 
     public boolean onMenuItemClick(MenuItem item) { 
       // do the menu action 
       return true; 
     } 
    }; 

    if (result.getType() == HitTestResult.IMAGE_TYPE || 
      result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { 
     // Menu options for an image. 
     //set the header title to the image url 
     menu.setHeaderTitle(result.getExtra()); 
     menu.add(0, ID_SAVEIMAGE, 0, "Save Image").setOnMenuItemClickListener(handler); 
     menu.add(0, ID_VIEWIMAGE, 0, "View Image").setOnMenuItemClickListener(handler); 
    } else if (result.getType() == HitTestResult.ANCHOR_TYPE || 
      result.getType() == HitTestResult.SRC_ANCHOR_TYPE) { 
     // Menu options for a hyperlink. 
     //set the header title to the link url 
     menu.setHeaderTitle(result.getExtra()); 
     menu.add(0, ID_SAVELINK, 0, "Save Link").setOnMenuItemClickListener(handler); 
     menu.add(0, ID_SHARELINK, 0, "Share Link").setOnMenuItemClickListener(handler); 
    } 
} 

Si quieres hacer algo más que un menú contextual, a continuación, utilizar un OnLongClickListener. Sin embargo, si desea interceptar el evento de clic largo, el HitTestResult es la clave. Eso es lo que le permitirá descubrir en qué hizo clic el usuario y hacer algo con él.

No he implementado realmente "Guardar enlace", lo acabo de incluir como ejemplo aquí. Pero para hacerlo, tendrías que hacer todo el proceso tú mismo; Tendría que hacer una solicitud HTTP GET, recibir la respuesta y luego almacenarla en algún lugar de la tarjeta SD del usuario. No hay manera de que yo sepa de invocar directamente la actividad de descarga de la aplicación del navegador. Su código "Guardar enlace" se verá algo como esto:

HitTestResult result = getHitTestResult(); 
HttpClient httpclient = new DefaultHttpClient(); 
HttpGet httpget = new HttpGet(result.getExtra()); 
HttpResponse response = httpclient.execute(httpget); 
HttpEntity entity = response.getEntity(); 
if (entity != null) { 
    URL url = new URL(result.getExtra()); 

    //Grabs the file part of the URL string 
    String fileName = url.getFile(); 

    //Make sure we are grabbing just the filename 
    int index = fileName.lastIndexOf("/"); 
    if(index >= 0) 
      fileName = fileName.substring(index); 

    //Create a temporary file 
    File tempFile = new File(Environment.getExternalStorageDirectory(), fileName); 
    if(!tempFile.exists()) 
      tempFile.createNewFile(); 

    InputStream instream = entity.getContent(); 
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream); 
    //Read bytes into the buffer 
    ByteArrayBuffer buffer = new ByteArrayBuffer(50); 
    int current = 0; 
    while ((current = bufferedInputStream.read()) != -1) { 
      buffer.append((byte) current); 
    } 

    //Write the buffer to the file 
    FileOutputStream stream = new FileOutputStream(tempFile); 
    stream.write(buffer.toByteArray()); 
    stream.close(); 
} 
+0

No puedo probar este código todavía, porque estoy donde estoy, pero ¿tiene que escribir el código para esas opciones de menú? p.ej. Guardar enlace? Si es así, ¿cómo lo hiciste? –

+0

Sí ... es realmente desafortunado, pero es la única forma en que he podido hacerlo. Añadiré más detalles a mi respuesta. –

+0

Todo el motivo por el que decidí usar un webView fue porque el sitio web estaba marcando el referer y no pude falsificarlo con HttpClient. ¿Hay alguna forma de verificar la URL y abrirla con el navegador web o crear un menú contextual? –

1

Habilitaría Javascript en la vista web. Luego use onMouseDown() y onMouseUp() para determinar la duración del clic.

También puede crear menús emergentes en Javascript (no en los menús estándar, sino en los suyos propios).

Finalmente puede interactuar entre Javascript y su código Android/Java.

Ejemplo de interacción simple entre Javascript y una aplicación de Android.

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/src/com/google/android/webviewdemo/WebViewDemo.java


Alternativamente, es posible que desee iniciar el navegador real en lugar de utilizar una vista Web.

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com")); 
startActivity(intent); 
+0

¿Podré ver el menú estándar de Android utilizando el método de Javascript? –

+0

¿Puedo seleccionar, elegir y guardar solo Guardar enlace? Además, ¿funcionará esto al usar un OvverideUrlLoading? –

+0

No sé cómo abrir el menú estándar del navegador (a menos que inicie el navegador) – LatinSuD

5

Me gustaría pensar que podría utilizar algo como esto:

WebView yourWebView; 
yourWebView.setLongClickable(true); 
yourWebView.setOnLongClickListener(...); 

Eso le debe permitir coger clics largos en la vista. Lo que haces después de eso ... ¡eso depende de ti!

+1

¿Puedo ver el menú estándar de Android? ¿Puedo elegir y elegir y guardar solo Guardar enlace? –

0

Solo quería copiar los datos de URL en un clic largo.
Al tomar como referencia la respuesta aceptada, escribí esto.

registerForContextMenu(webView); 


@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 

    WebView webView = (WebView) v; 
    HitTestResult result = webView.getHitTestResult(); 

    if (result != null) { 
     if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE) { 
      String linkToCopy = result.getExtra(); 
      copyToClipboard(linkToCopy, AppConstants.URL_TO_COPY); 
     } 
    } 
} 
Cuestiones relacionadas