2014-12-28 52 views
0

我創建了Android應用程序,並希望將圖像從URL上傳到ImageView。 在Android清單設置權限無法從URL上傳圖像

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

從URL嘗試上傳圖片

public void getBitmapfromURL(String src) 
{ 
    try 
    { 
    URL url = new URL(src); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setDoInput(true); 
    connection.connect(); 
    InputStream input = url.openStream(); 
    Bitmap bmp = BitmapFactory.decodeStream(input); 

    return bmp; 
    } 
    catch(Exception ex) 
    { 
    Log.i("MyMessage", "ERROR!!!!"); 

    return null; 
    } 
} 

我的堆棧跟蹤,當我嘗試從URL

12-28 22:36:33.501: W/System.err(4605): android.os.NetworkOnMainThreadException 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
 
12-28 22:36:33.501: W/System.err(4605): \t at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
 
12-28 22:36:33.501: W/System.err(4605): \t at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
 
12-28 22:36:33.501: W/System.err(4605): \t at java.net.InetAddress.getAllByName(InetAddress.java:214) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.example.testloadimg.MainActivity.getBitmapfromURL(MainActivity.java:35) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.example.testloadimg.MainActivity.onCreate(MainActivity.java:25) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.app.Activity.performCreate(Activity.java:5231) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.app.ActivityThread.access$800(ActivityThread.java:135) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.os.Handler.dispatchMessage(Handler.java:102) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.os.Looper.loop(Looper.java:136) 
 
12-28 22:36:33.501: W/System.err(4605): \t at android.app.ActivityThread.main(ActivityThread.java:5001) 
 
12-28 22:36:33.501: W/System.err(4605): \t at java.lang.reflect.Method.invokeNative(Native Method) 
 
12-28 22:36:33.501: W/System.err(4605): \t at java.lang.reflect.Method.invoke(Method.java:515) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
 
12-28 22:36:33.501: W/System.err(4605): \t at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
 
12-28 22:36:33.501: W/System.err(4605): \t at dalvik.system.NativeStart.main(Native Method) 
 
12-28 22:36:33.501: E/MyMessage(4605): ERROR!!!! 
 
12-28 22:36:33.685: D/libEGL(4605): loaded /system/lib/egl/libEGL_genymotion.so 
 
12-28 22:36:33.693: D/(4605): HostConnection::get() New Host Connection established 0xb7dd9ab0, tid 4605 
 
12-28 22:36:33.717: D/libEGL(4605): loaded /system/lib/egl/libGLESv1_CM_genymotion.so 
 
12-28 22:36:33.717: D/libEGL(4605): loaded /system/lib/egl/libGLESv2_genymotion.so 
 
12-28 22:36:33.901: W/EGL_genymotion(4605): eglSurfaceAttrib not implemented 
 
12-28 22:36:33.909: E/OpenGLRenderer(4605): Getting MAX_TEXTURE_SIZE from GradienCache 
 
12-28 22:36:33.913: E/OpenGLRenderer(4605): MAX_TEXTURE_SIZE: 16384 
 
12-28 22:36:33.937: E/OpenGLRenderer(4605): Getting MAX_TEXTURE_SIZE from Caches::initConstraints() 
 
12-28 22:36:33.941: E/OpenGLRenderer(4605): MAX_TEXTURE_SIZE: 16384 
 
12-28 22:36:33.941: D/OpenGLRenderer(4605): Enabling debug mode 0

+0

結果是什麼? – Divers

+0

錯誤。它不能設置連接URL –

+0

更改Log.i(「MyMessage」,「錯誤!!!!」); Log.e(「ERROR」,「」,ex);請提供網址。 – Divers

回答

0

您的問題上傳圖片與th很清楚是行:

12-28 22:36:33.501: W/System.err(4605): android.os.NetworkOnMainThreadException 

這意味着你應該移動你的網絡連接相關的代碼,並把它們放到一個單獨的線程。

請大家看看AsyncTaskAndroid Developers

+0

謝謝您發現錯誤 –

+0

@СтасПишевский歡迎您:) – dumbfingers

0

嚴格模式,因爲3.0不能運行在UI線程上的網絡代碼,您可以覆蓋這是一個不好的做法:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

或創建的AsyncTask - 作爲對示例 - 一個內部類,將加載圖像:

private Bitmap myBitmapFromURL; 
private class ImageLoadTask extends AsyncTask<String, Void, Bitmap> { 

private ImageView imageView;  

@Override 
protected Bitmap doInBackground(String... params) { 
    try { 
     String src = params[0]; 
     URL url = new URL(src); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     InputStream input = connection.getInputStream(); 
     Bitmap bmp = BitmapFactory.decodeStream(input); 
     return bmp; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

@Override 
protected void onPostExecute(Bitmap result) { 
    super.onPostExecute(result); 
    myBitmapFromURL = result; 
} 
} 

然後運行任務:

new ImageLoadTask().execute("URL of the file"); 
+0

謝謝!我自己創建了AsyncTask。我練習,現在我知道如何去做:-) –