2017-01-19 2 views
0

Просто попасть в библиотеку загрузки изображений Glide для Android. В настоящее время работает с некоторым кодом здесь: https://github.com/bumptech/glide/issues/459Android, библиотека загрузки изображений Glide: NullPointerException, ProviderInfo

Мой полный проект здесь вы хотите посмотреть на него:

https://github.com/mhurwicz/glide02

Я получаю следующее исключение при запуске приложения в эмулятор в Android Studio:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference 

Это ключ заявление в MainActivity:

new ShareTask(this).execute("http://thelink"); 

(thelink на самом деле goo.gl/gEgYUd - не мог оставить это выше, потому что stackoverflow не позволяет укорачивать URL-адреса.)

Вот мой код для класса ShareTask

class ShareTask extends AsyncTask<String, Void, File> { 
    private final Context context; 

    public ShareTask(Context context) { 
     this.context = context; 
    } 
    @Override protected File doInBackground(String... params) { 
     String url = params[0]; // should be easy to extend to share multiple images at once 
     try { 
      return Glide 
        .with(context) 
        .load(url) 
        .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) 
        .get() // needs to be called on background thread 
        ; 
     } catch (Exception ex) { 
      Log.w("SHARE", "Sharing " + url + " failed", ex); 
      return null; 
     } 
    } 
    @Override protected void onPostExecute(File result) { 
     if (result == null) { return; } 
     Uri uri = FileProvider.getUriForFile(context, context.getPackageName(), result); 
     share(uri); // startActivity probably needs UI thread 
    } 

    private void share(Uri result) { 
     Intent intent = new Intent(Intent.ACTION_SEND); 
     intent.setType("image/jpeg"); 
     intent.putExtra(Intent.EXTRA_SUBJECT, "Shared image"); 
     intent.putExtra(Intent.EXTRA_TEXT, "Look what I found!"); 
     intent.putExtra(Intent.EXTRA_STREAM, result); 
     context.startActivity(Intent.createChooser(intent, "Share image")); 
    } 
} 

Использование отладки, я, кажется, может быть запущен в неприятности в get() заявлении. Во-первых, ширина и высота - очень большие отрицательные числа. (См. Код, выделенный зеленым цветом ниже.) Затем оператор get() возвращает null. (См. Код, выделенный красным цветом ниже.)

Заранее благодарим за любую помощь, которую вы можете предоставить!

enter image description here

+1

предоставьте больше журналов –

ответ

2

NPE исходит из FileProvider.getUriForFile, потому что вы передаете в ненадлежащий орган. Вы указали в манифесте android:authorities="com.example.fileprovider", но вы используете имя пакета при вызове. Это не разрешает info в FileProvider.parsePathStrategy. Сопоставьте эти две струны, и вам будет хорошо.

Самое простое исправить - использовать android:authorities="${applicationId}", это приводит к 0 жестко закодированным строкам, поэтому вы можете продолжать использовать context.getPackageName().

Что касается ваших проблем во время отладки:

  • Target.SIZE_ORIGINAL объявляется MIN_VALUE, следовательно, большое количество
  • это не возвращение null, IDEA просто запутаться о том, где он находится в методе, который return null; не должен 't будет выполняться, если он не сработает в коде FileProvider.
  • doGet(null): null является таймаут здесь, это ограждены в коде

Я запустить приложение и удачливый я получил лаглинь говоря

W/SHARE: Совместное использование HTTP:// ...не удалось

но не трассировки стека, что это странно, потому что ex не может быть в catchnull!

+0

Спасибо, @TWiStErRob - Это прояснило эту проблему. Однако теперь я получаю IllegalArgumentException: Не удалось найти настроенный root, который содержит/data/data /. Подробности здесь: http://stackoverflow.com/questions/41754799/android-illegalargumentexception-failed-to-find-configured-root-that-contains – user1147171

Смежные вопросы