2016-05-05 2 views
0

Я разрабатываю приложение для Android. В моем приложении мне нужно преобразовать url в растровое изображение. Я искал в Интернете, и я нашел некоторый код в stackoverflow. Я просто использовал его. Но это не работает. Это дает мне ошибку.Невозможно преобразовать URL-адрес в растровое изображение в android

Это мой метод преобразования

public final class CommonHelper{ 
    public static Bitmap ConvertUrlToBitmap(String src) 
    { 
     try { 
      URL url = new URL(src); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

Так что, когда я использую этот метод в деятельности, он дает мне ошибку. Это ошибка в logcat.

Это ошибки

05-05 17:41:16.674 10095-10101/? E/jdwp: Failed sending reply to debugger: Broken pipe 
05-05 17:41:16.674 10095-10101/? D/dalvikvm: Debugger has detached; object registry had 1 entries 
05-05 17:41:16.770 10095-10095/? W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;) 
05-05 17:41:16.770 10095-10095/? I/dalvikvm: Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.view.WindowCallbackWrapper.onSearchRequested 
05-05 17:41:16.770 10095-10095/? W/dalvikvm: VFY: unable to resolve interface method 18254: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z 
05-05 17:41:16.770 10095-10095/? D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002 
05-05 17:41:16.770 10095-10095/? I/dalvikvm: Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.view.WindowCallbackWrapper.onWindowStartingActionMode 
05-05 17:41:16.770 10095-10095/? W/dalvikvm: VFY: unable to resolve interface method 18258: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode; 
05-05 17:41:16.770 10095-10095/? D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002 
05-05 17:41:16.782 10095-10098/? D/dalvikvm: GC_CONCURRENT freed 169K, 12% free 2684K/3020K, paused 2ms+0ms, total 5ms 
05-05 17:41:16.786 10095-10095/? I/AppCompatViewInflater: app:theme is now deprecated. Please move to using android:theme instead. 
05-05 17:41:16.786 10095-10095/? I/dalvikvm: Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.widget.TintTypedArray.getChangingConfigurations 
05-05 17:41:16.786 10095-10095/? W/dalvikvm: VFY: unable to resolve virtual method 522: Landroid/content/res/TypedArray;.getChangingConfigurations()I 
05-05 17:41:16.786 10095-10095/? D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 
05-05 17:41:16.790 10095-10095/? I/dalvikvm: Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.widget.TintTypedArray.getType 
05-05 17:41:16.790 10095-10095/? W/dalvikvm: VFY: unable to resolve virtual method 544: Landroid/content/res/TypedArray;.getType (I)I 
05-05 17:41:16.790 10095-10095/? D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002 
05-05 17:41:16.798 10095-10095/? D/dalvikvm: GC_FOR_ALLOC freed 37K, 10% free 2814K/3120K, paused 3ms, total 3ms 
05-05 17:41:16.798 10095-10095/? I/dalvikvm-heap: Grow heap (frag case) to 3.981MB for 1127532-byte allocation 
05-05 17:41:16.802 10095-10104/? D/dalvikvm: GC_FOR_ALLOC freed <1K, 8% free 3914K/4224K, paused 3ms, total 3ms 
05-05 17:41:16.806 10095-10098/? D/dalvikvm: GC_CONCURRENT freed <1K, 8% free 3914K/4224K, paused 0ms+0ms, total 2ms 
05-05 17:41:16.834 10095-10098/? D/dalvikvm: GC_CONCURRENT freed 159K, 8% free 4153K/4480K, paused 2ms+0ms, total 5ms 
05-05 17:41:16.846 10095-10095/? I/CURRENT_LANGUAGE: 1 
05-05 17:41:16.850 10095-10095/? D/AndroidRuntime: Shutting down VM 
05-05 17:41:16.850 10095-10095/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa4b60648) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime: FATAL EXCEPTION: main 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.blog.waiyanhein.mmfashion.mmfashion/com.blog.waiyanhein.mmfashion.mmfashion.MainActivity}: android.os.NetworkOnMainThreadException 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:137) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5103) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at java.lang.reflect.Method.invokeNative(Native Method) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:525) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at dalvik.system.NativeStart.main(Native Method) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime: Caused by: android.os.NetworkOnMainThreadException 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.io.IoBridge.connect(IoBridge.java:112) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at java.net.Socket.connect(Socket.java:842) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:76) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.blog.waiyanhein.mmfashion.model.CommonHelper.ConvertUrlToBitmap(CommonHelper.java:595) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.blog.waiyanhein.mmfashion.mmfashion.MainActivity.addCategoriesToMenu(MainActivity.java:345) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.blog.waiyanhein.mmfashion.mmfashion.MainActivity.bindCategoryMenu(MainActivity.java:376) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.blog.waiyanhein.mmfashion.mmfashion.MainActivity.onCreate(MainActivity.java:101) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.Activity.performCreate(Activity.java:5133) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.access$600(ActivityThread.java:141)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:99)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:137)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5103)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at java.lang.reflect.Method.invokeNative(Native Method)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:525)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)  
05-05 17:41:16.850 10095-10095/? E/AndroidRuntime:  at dalvik.system.NativeStart.main(Native Method)  

Поэтому, пожалуйста, почему это происходит и как я могу исправить это? Как преобразовать URL-адрес в растровое изображение?

Я также попробовал этот способ

public static Bitmap ConvertUrlToBitmap(String src) 
    { 
     try{ 
      URL url = new URL(src); 
      Bitmap image = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
      return image; 
     } 
     catch (IOException e) 
     { 
      return null; 
     } 
    } 
+1

http: // stackoverflow.com/questions/6343166/how-to-fix-android-os-networkonmainthreadexception – CommonsWare

ответ

0

Вы пытаетесь запустить сетевое задание в своем основном потоке (что может помешать обновлению пользовательского интерфейса - вот почему Android жалуется).

Вы должны запустить AsyncTask, который вы можете использовать для загрузки изображения и возврата в выделенный метод обратного вызова.

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

+0

На самом деле мне просто нужно сделать вывод. Я хочу установить значок для пункта меню, например menu.add («Название»). SetIcon (drawable); , Поэтому я думаю, что пикассо не может это решить. Итак, как я могу это достичь? –

+0

@WaiYan - Предположим, вы должны уточнить свой вопрос, чтобы предоставить более подробную информацию, поскольку в вопросе говорится, что у вас есть проблема только при загрузке изображений в виде растровых изображений. – tommus

+0

Спасибо, но я уладил решение. –

0

Вы пытаетесь подключить интернет и делать сетевую задачу. Все сетевые задачи должны выполняться в отдельном потоке.

Дайте этому попытку:

private Bitmap bitmap; 

private class ConvertUrlToBitmap extends AsyncTask<String, Long, Boolean> { 
    @Override 
    protected Boolean doInBackground(String... params) { 
     try { 
      URL url = new URL(params[0]); 
      bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
      return true; 
     } catch (Exception e) { 
      Log.e(TAG, e.toString()); 
      return false; 
     } 
    } 

    @Override 
    protected void onPostExecute(Boolean aBoolean) { 
     super.onPostExecute(aBoolean); 
     if(aBoolean) { 
      // download was successful 
      // if you want to update your UI, make sure u do it on main thread. like this: 
      MyActivity.this.runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        // update UI here 
       } 
      }); 
     } else { 
      // download failed 
     } 
    } 
} 

Затем на кнопку мыши или, если вы хотите, чтобы загрузить его, просто назвать это:

new ConvertUrlToBitmap().execute(src); 

Надеется, что это помогает!

0

Запишите код в свой файл активности после setContentView(R.layout.activity_your);

if (android.os.Build.VERSION.SDK_INT > 9) { 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 

И ниже выражение импорта в ваш файл java.

import android.os.StrictMode; 
0

попробуйте ввести код в Thread.

И я думаю, вы можете использовать WebView для отображения URL изображения:

webView.loadUrl(urlImage) 
0

Используйте AsyncTask для этой цели. Вы можете попробовать.

class GetImage extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    public Bitmap doInBackground(String... urls) { 
     Bitmap map = null; 
     try { 
      URL url = new URL(urls[0]); 
      HttpURLConnection connection =(HttpURLConnection)url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      map= BitmapFactory.decodeStream(input); 


     } catch (Exception e) { 

      e.printStackTrace(); 

     } 

     return map; 
    } 

    protected void onPostExecute(Bitmap bMap) { 


     try { 
      if (!isCancelled()) { 
       if (bMap != null) { 
        //set your image view here. 

       } 
      } 
     }catch (Exception exception){ 
     exception.printStackTrace(); 
     } 
    } 

} 
+0

вызов GetImage как GetImage img = new GetImage(); img.execute («ваш URL-адрес изображения»); – Riten

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