Я хочу загрузить файл программно в Android, но при запуске он закрывается?

Я думаю, что мое соединение не удалось, но я не могу восстановить код.

URL url = new URL( imageURL);
File file = new File(fileName);
URLConnection ucon = url.openConnection();
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);

при отладке он разбился в этой части кода. я использую

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

а также

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

person mohammad madani    schedule 25.02.2014    source источник
comment
Что говорится в отчете о сбое? т.е. вывод logcat   -  person Tim    schedule 25.02.2014
comment
проверьте мой связанный пост: stackoverflow.com/questions/15549421/   -  person Droidman    schedule 25.02.2014
comment
к сожалению, майап остановился   -  person mohammad madani    schedule 25.02.2014
comment
проверьте журнал, что он говорит.   -  person Johan    schedule 25.02.2014
comment
Скопируйте свой отчет LogCat и вставьте в наш вопрос.   -  person Hamid Shatu    schedule 25.02.2014
comment
Я думаю, что ваш logcat содержит NetworkOnMainThreadException. Чтобы быть уверенным, скопируйте ошибку из своего лог-каталога.   -  person Glenn    schedule 25.02.2014
comment
выполните это в Asynctask или потоке. Вы должны выполнять его в своем основном UIthread, например onCreate()   -  person Sheraz Ahmad Khilji    schedule 25.02.2014
comment
в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)   -  person mohammad madani    schedule 25.02.2014
comment
Гленн Совершенно верно.   -  person mohammad madani    schedule 25.02.2014


Ответы (3)


Напишите приведенный ниже код в свою MainActivity после setContentView(R.layout.activity_main)

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

Выше Android 3.0 вам нужно сделать всю свою сеть в отдельном потоке. Поэтому, если вы попробуете этот код в основном потоке, он вызовет исключение NetworkOnMainThread.

попробуйте это, чтобы проверить это:

try{
    URL url = new URL( imageURL);
    File file = new File(fileName);
    URLConnection ucon = url.openConnection();
    InputStream is = ucon.getInputStream();
    BufferedInputStream bis = new BufferedInputStream(is);
}
catch (android.os.NetworkOnMainThreadException ex){
    // Skipp.
}

Если ваше приложение не дает сбоев таким образом, вам нужно использовать AssyncTask для сети. Вот хороший пример .

И не забудьте проверить путь к файлу, как предлагает @LucianNovac.

person Hegi    schedule 25.02.2014

Попробуйте инициализировать файл следующим образом:

File extStore = Environment.getExternalStorageDirectory();
File file = new File(extStore, fileName);

и не забудьте добавить в свой файл манифеста

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

Также, чтобы избежать сетевых исключений, поместите это в asynk

class DownloadMyFIle extends AsyncTask<String, Void, DownloadProcess> {

    private Exception exception;

    protected DownloadProcess doInBackground(String... urls) {
        try {
            File extStore = Environment.getExternalStorageDirectory();
            File file = new File(extStore, fileName);
            ....
        } catch (Exception e) {
            this.exception = e;
            return null;
        }
    }

    protected void onPostExecute(DownloadProcess process) {
        // TODO: check this.exception 

    }
}
person Lucian Novac    schedule 25.02.2014