Не удается подключить свежий эмулятор Android SDK через простое приложение
Неделю назад (февраль 2014 г.) я скачал последнюю версию Android SDK с Eclipse. Я новичок в этом, но не тупой в программировании на Java, но эта проблема просто убивает меня.
Я пытался сделать простое руководство по загрузке файла из Интернета. После провала нескольких уроков я наконец-то дошел до этого. Но в эмуляторе это приложение не может подключиться к Интернету. Я добавил простой TextView
флаги, чтобы выследить проблему, и это всегда httpConn.connect();
,
Вот кикер - когда это приложение установлено на мой Samsung Galaxy Y (GT-S5360), оно работает нормально.
В SDK Manager установлен Google Web Driver - браузер эмулятора подключается к интернету. Но независимо от того, что я делаю, эмулятор просто не позволяет моему приложению подключаться.
Да, uses-permission android:name="android.permission.INTERNET" />
существует.
Да, 3G бары присутствуют.
Да, ссылка на файл написана правильно.
Нет, ручная установка приложения каждый раз на реальное устройство не является хорошим решением для работы, которую я делаю.
ПК использует кабельное интернет-соединение. Пробовал эмулятор на 64-битной Windows7 (с правами администратора и без), а 32-битный эмулятор Android SDK на 32-битной WindowsXP. Перезапущенное затмение. Загрузил SDK снова. Перезагрузил компьютер. Перепробовал много предложений, в том числе "-dns-server 8.8.8.8,8.8.4.4". Все не удается подключиться в httpConn.connect();
,
Код это хорошо и просто. Чего не хватает только что загруженному эмулятору Android SDK?!
Шаги для тиражирования:
1) Загрузите последнюю версию Android SDK с официального сайта.
2) Запустите менеджер SDK и установите предложения по умолчанию + Google Web Driver
3) Создайте приложение из этого учебника: http://www.edumobile.org/android/android-beginner-tutorials/downloading-an-image-from-the-server-and-displaying-it-on-screen/
4) Запустите приложение как Android-приложение - получите белый экран, потому что httpConn.connect();
не удалось.
Вот обновленный отчет об ошибках LogCat:
D/dalvikvm(933): Not late-enabling CheckJNI (already on)
W/System.err(933): java.io.IOException: Error connecting
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.OpenHttpConnection(downloadImage.java:70)
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.DownloadImage(downloadImage.java:83)
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.onCreate(downloadImage.java:24)
W/System.err(933): at android.app.Activity.performCreate(Activity.java:5231)
W/System.err(933): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
W/System.err(933): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
W/System.err(933): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
W/System.err(933): at android.app.ActivityThread.access$800(ActivityThread.java:135)
W/System.err(933): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
W/System.err(933): at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err(933): at android.os.Looper.loop(Looper.java:136)
W/System.err(933): at android.app.ActivityThread.main(ActivityThread.java:5017)
W/System.err(933): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(933): at java.lang.reflect.Method.invoke(Method.java:515)
W/System.err(933): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
W/System.err(933): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
W/System.err(933): at dalvik.system.NativeStart.main(Native Method)
W/System.err(933): Caused by: android.os.NetworkOnMainThreadException
W/System.err(933): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
W/System.err(933): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
W/System.err(933): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
W/System.err(933): at java.net.InetAddress.getAllByName(InetAddress.java:214)
W/System.err(933): at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
W/System.err(933): at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
W/System.err(933): at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
W/System.err(933): at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
W/System.err(933): at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
W/System.err(933): at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
W/System.err(933): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
W/System.err(933): at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
W/System.err(933): at com.example.testfiledownlaod3.downloadImage.OpenHttpConnection(downloadImage.java:54)
W/System.err(933): ... 16 more
D/gralloc_goldfish(933): Emulator without GPU emulation detected.
1 ответ
Спасибо, что дали мне соломинки, чтобы понять. После получения Caused by: android.os.NetworkOnMainThreadException
Я отследил проблему до реализации AsyncTask. Оказывается, эмулятору не нравится, когда вы используете все свои интернет-процессы в одном классе. Поэтому после просмотра других примеров я в итоге разбил учебник на два класса.
package com.example.testfiledownlaod3;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
public class downloadImage extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView img = (ImageView) findViewById(R.id.imageView1);
String URL = "http://www.allindiaflorist.com/imgs/arrangemen4.jpg";
img.setTag(URL);
new DownloadImageTask().execute(img);
}
}
а также
package com.example.testfiledownlaod3;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;
public class DownloadImageTask extends AsyncTask<ImageView, Void, Bitmap>
{
ImageView imageView = null;
@Override
protected Bitmap doInBackground(ImageView... imageViews)
{
this.imageView = imageViews[0];
return download_Image((String)imageView.getTag());
}
private Bitmap download_Image(String url)
{
Bitmap bmp=null;
try
{
URL ulrn = new URL(url);
HttpURLConnection con = (HttpURLConnection)ulrn.openConnection();
InputStream instr = con.getInputStream();
bmp = BitmapFactory.decodeStream(instr);
instr.close();
}
catch (Exception ex){}
return bmp;
}
@Override
protected void onPostExecute(Bitmap result)
{
imageView.setImageBitmap(result);
}
}
Работает на эмуляторе и на моем Samsung Galaxy Y (GT-S5360)