2016-04-04 3 views
3

Я ищу решение для нескольких дней для своей проблемы, но я не могу найти хороший. Поэтому я хотел спросить здесь еще раз, прежде чем начать разработку родного приложения для Android, так как я не могу решить эту проблему.Android, не удается загрузить изображения с помощью WebView

Как говорится в названии, я пытаюсь загрузить изображение с помощью webview в html-контент, который NORMALLY выбирает изображение, показывая его на странице и позволяя пользователю обрезать его. Я сделал целое приложение и проверил его на обычном браузере моего телефона, поэтому я не знал, что это не работает. Вот почему это ужасно расстраивает.

Те решения, которые я нашел в Интернете, не работают на моем Android, и я читал, что это уже невозможно.

Кто-нибудь знает, возможно ли это или нет? Было бы очень полезно, если бы я мог получить больше информации об этом (даже если это возможно или нет?) Спасибо в Adavnce ...

+0

Вы следуете за новой моделью разрешения с API 23? – Sibidharan

+0

Что ты имеешь в виду? @Sibidharan – yadbo

+0

Пока вы выбираете файл с помощью WebView, ваше приложение должно получить разрешение от системы, чтобы оно прочитало 'EXTERNAL_STORAGE'. Модель разрешения из API 23 - это модель RunTime OnDemand. Вы показали, что перед тем, как выбрать изображение из галереи, используя «WebView»? – Sibidharan

ответ

3

Попробуйте добавить эти разрешения.

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

Android 6,0 ​​Зефир представляет новую модель для обработки разрешений, которые упрощают процесс для пользователей при установке и обновления приложений. Если вы используете версию 8.1 или более поздней версии Google Службы воспроизведения, вы можете настроить приложение для таргетинга на Android 6.0 SDK Marshmallow и использовать новую модель разрешений.

Если ваше приложение поддерживает новую модель разрешений, у пользователя нет , чтобы предоставить какие-либо разрешения при установке или обновлении приложения. Вместо этого приложение должно запрашивать разрешения при необходимости в времени выполнения, и система показывает диалог пользователю, запрашивающему разрешение .

Чтобы узнать больше, см. Документацию для Android 6.0 Marshmallow и изменений, которые вы должны внести в свое приложение для new permissions model.

Google добавил WebChromeClient.onShowFileChooser. Они даже предоставляют способ автоматически генерировать намерение выбора файла, чтобы он использовал типы ввода accept mime.

Реализовать его таким образом (от an answer by weiyin):

public class MyWebChromeClient extends WebChromeClient { 
     // reference to activity instance. May be unnecessary if your web chrome client is member class. 
    private MyActivity activity; 

    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { 
     // make sure there is no existing message 
     if (myActivity.uploadMessage != null) { 
      myActivity.uploadMessage.onReceiveValue(null); 
      myActivity.uploadMessage = null; 
     } 

     myActivity.uploadMessage = filePathCallback; 

     Intent intent = fileChooserParams.createIntent(); 
     try { 
      myActivity.startActivityForResult(intent, MyActivity.REQUEST_SELECT_FILE); 
     } catch (ActivityNotFoundException e) { 
      myActivity.uploadMessage = null; 
      Toast.makeText(myActivity, "Cannot open file chooser", Toast.LENGTH_LONG).show(); 
      return false; 
     } 

     return true; 
    } 
} 


public class MyActivity extends ... { 
    public static final int REQUEST_SELECT_FILE = 100; 
    public ValueCallback<Uri[]> uploadMessage; 

    protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
     if (requestCode == REQUEST_SELECT_FILE) { 
       if (uploadMessage == null) return; 
       uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data)); 
       uploadMessage = null; 
      } 
     } 
    } 
} 

Убедитесь, что скомпилировать приложение с API 21+. И это будет работать на всех платформах, как вы упомянете о своей градиенте.

+2

При цитировании кода укажите имя автора и отметьте его как цитату. См. [Наш справочный центр] (https://stackoverflow.com/help/referencing) о том, как правильно ссылаться на работы других. –

+0

@MartijnPieters Конечно, спасибо, что сообщили мне об этом. Я буду следовать за всеми моими будущими цитатами. – Sibidharan

+0

Теперь он работает в моем случае, то есть для веб-страниц начальной загрузки PHP, с использованием Webchromeclient, как показано выше. – Harpreet

1

Это метод работы с API 11 до 23

static WebView mWebView; 
private ValueCallback<Uri> mUploadMessage; 
public ValueCallback<Uri[]> uploadMessage; 
public static final int REQUEST_SELECT_FILE = 100; 
private final static int FILECHOOSER_RESULTCODE = 1; 

Теперь изменить или переопределить ваш метод onActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) 
{ 
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
    { 
     if (requestCode == REQUEST_SELECT_FILE) 
     { 
      if (uploadMessage == null) 
       return; 
       uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)); 
     uploadMessage = null; 
    } 
} 
else if (requestCode == FILECHOOSER_RESULTCODE) 
{ 
    if (null == mUploadMessage) 
     return; 
// Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment 
// Use RESULT_OK only if you're implementing WebView inside an Activity 
    Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData(); 
    mUploadMessage.onReceiveValue(result); 
    mUploadMessage = null; 
} 
else 
    Toast.makeText(getActivity().getApplicationContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show(); 

}

Теперь в OnCreate метод вставьте следующий код

mWebView.setWebChromeClient(new WebChromeClient() 
{ 
// For 3.0+ Devices (Start) 
// onActivityResult attached before constructor 
protected void openFileChooser(ValueCallback uploadMsg, String acceptType) 
{ 
    mUploadMessage = uploadMsg; 
    Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
    i.addCategory(Intent.CATEGORY_OPENABLE); 
    i.setType("image/*"); 
    startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE); 
} 


// For Lollipop 5.0+ Devices 
public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) 
{ 
    if (uploadMessage != null) { 
     uploadMessage.onReceiveValue(null); 
     uploadMessage = null; 
    } 

    uploadMessage = filePathCallback; 

    Intent intent = fileChooserParams.createIntent(); 
    try 
    { 
     startActivityForResult(intent, REQUEST_SELECT_FILE); 
    } catch (ActivityNotFoundException e) 
    { 
     uploadMessage = null; 
     Toast.makeText(getActivity().getApplicationContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show(); 
     return false; 
    } 
    return true; 
} 

//For Android 4.1 only 
protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) 
{ 
    mUploadMessage = uploadMsg; 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.setType("image/*"); 
    startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE); 
} 

protected void openFileChooser(ValueCallback<Uri> uploadMsg) 
{ 
    mUploadMessage = uploadMsg; 
    Intent i = new Intent(Intent.ACTION_GET_CONTENT); 
    i.addCategory(Intent.CATEGORY_OPENABLE); 
    i.setType("image/*"); 
    startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE); 
} 
}); 
1

ответа не решает этот вопрос здесь .. некоторые экспертные андроид люди дают решение для построения загрузки изображения в андроида код .. что не этот вопрос просить .. У меня такой же вопрос беспокоит меня .. Мы спрашиваем, что страница HTML/PHP, загружаемая в приложение webview, не запускает приложение галереи или камеры, поскольку оно запускает «загрузку файла с ПК» на настольный компьютер/ноутбук в Mozilla или chrome .. Это похоже на веб-сайт из iframe kind a thing .. но внутри веб-представления приложения для Android. Думаю, я ясно дал понять. Мы не программисты для Android, мы являемся веб-разработчиками.

<form method="post" action="" enctype="multipart/form-data" name="form1"> 
<!-- this following input is not working in webview --> 
<input size="25" name="file" type="file"> 
<input name="submit" type="submit" value="submit"> 
</form> 
Смежные вопросы