Android: программно получить IMG SRC из галереи изображений в WebView - PullRequest
1 голос
/ 02 июня 2011

Я использую WebView, который отображает хороший HTML. Одно из изображений должно быть выбрано из галереи изображений и отображено в WebView.

Итак, в основном мне нужен Javascript для доступа к Java (чтобы открыть галерею), а также к Java для доступа к Javascript (чтобы получить результат)

Я использовал следующий код:

public class JavaScriptInterface
{    
      Context mContext;
      Uri currImageURI;
      JavaScriptInterface(Context c)
      {
          mContext = c;
      }

    public void imageFromGallery()
    {    
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"),1);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {         
        String retResult="";
        if (resultCode == RESULT_OK) 
        {                
            if (requestCode == 1) 
            {
                currImageURI = data.getData();
                retResult=getRealPathFromURI(currImageURI);
            }
        }
        mWebView.loadUrl("javascript:updateImage("+retResult+")");
    }

    public String getRealPathFromURI(Uri contentUri) 
    {
    String [] proj={MediaStore.Images.Media.DATA};
    Cursor cursor = managedQuery( contentUri,proj,null,null,null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
    }

}

Теперь вызов Java из моего скрипта работает нормально. Я добавил onClick="Android.imageFromGallery()", и он правильно открывает Галерею. Кстати, это дает мне выбор между Astro, File Manager и Gallery. Как я могу ограничить его галереей, чтобы он не спрашивал пользователя, какой файловый браузер использовать?

В любом случае, проблема заключается в том, что Java вызывает Javascript для передачи результата. Очевидно, updateImage() (моя функция JS, которая просто показывает имя изображения) не получает вызова из кода Java.

Что я здесь не так делаю?

РЕДАКТИРОВАТЬ: решена первая проблема - я могу напрямую позвонить в Галерею, используя

Intent getImageFromGalleryIntent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.INTERNAL_CONTENT_URI); startActivityForResult(getImageFromGalleryIntent, 1);

1 Ответ

1 голос
/ 03 июня 2011

Решено! Ошибка состояла в том, чтобы добавить onActivityResult в качестве функции внутри класса JavascriptInterface, в то время как он должен был находиться вне его, в определении WebView.

(я не мог ответить на свой вопрос раньше, потому что моя репутация недостаточно высока, поэтому мне пришлось подождать несколько часов)

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {         
        if (resultCode == RESULT_OK) 
        {                
            if (requestCode == 1) 
            {
                Uri currImageURI = data.getData();
                String retResult = getRealPathFromURI(currImageURI);
                mWebView.loadUrl("javascript:updateImage('"+retResult+"')");
            }
        }
    }

    public String getRealPathFromURI(Uri contentUri) 
    {
            String [] proj={MediaStore.Images.Media.DATA};
            Cursor cursor = managedQuery( contentUri,proj,null,null,null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
    }

    public class JavaScriptInterface
    {    
        Context mContext;
        Uri currImageURI;
        JavaScriptInterface(Context c)
        {
            mContext = c;
        }

        public void imageFromGallery()
        {    
            Intent getImageFromGalleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
            startActivityForResult(getImageFromGalleryIntent, 1);
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...