Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
1

Подключаемые библиотеки в Android Studio

31.10.2015, 00:01. Просмотров 2788. Ответов 14
Метки нет (Все метки)

Сразу скажу что я нуб, сегодня первый день когда взялся за java и android studio. Написал пока примитивный класс для отправки post данных на сервер.
И большую часть времени потратил на разбор полетов с android studio, потому как:

1) org.apache.http почему-то не входит в стандартный набор пакетов, как скачать через стандартные тулсы ide я не нашел.
Зашел на сайт апача, скачал библиотеки, закинул в папку проекта \app\libs (httpclient-4.5.1, httpcore-4.4.3) и в android studio правой кнопкой мыши добавил эти библиотеки ( зачем это кстати если они уже лежат в папке lib ? ).

2) после добавления необходимых библиотек, выпал error:
Error:duplicate files during packaging of APK app\build\outputs\apk\app-debug-unaligned.apk
Path in archive: META-INF/DEPENDENCIES
Origin 1: \app\libs\httpclient-4.5.1.jar
Origin 2: \app\libs\httpcore-4.4.3.jar
По совету компилятора добавил в build.gradle
Код
packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
}
но WTF ? что это еще за история, какая еще дубликация файлов если как я понял у каждой библиотеки есть такие файлы.

3) Теперь ошибок нет, но приложение вылетает и в дебагере ничего нет, елки палки ну как искать тогда ошибки ?
окей, запустил этот метод отправки post не при старте приложения, а при нажатии на кнопку и тут уже дебаг показал:
FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.VerifyError: org/apache/http/conn/ssl/DefaultHostnameVerifier
E/AndroidRuntime: at org.apache.http.impl.client.HttpClientBuilder.build(HttpClientBuilder.java:944)
E/AndroidRuntime: at ru.project.te.api.send(api.java:38)
E/AndroidRuntime: at ru.project.te.MainActivity$1.onClick(MainActivity.java:40)
E/AndroidRuntime: at android.view.View.performClick(View.java:4276)
E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:17757)
E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:730)
E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5223)
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:525)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
Да что ты б** опять не работаешь ?!

Что теперь править, что бы элементарный post запрос отработал ?

Код прилагаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
 
public class api {
 
    private String url = "http://example.com/api.php";
    private String key = "test";
 
 
 
    public String send( String method_name , List<NameValuePair> params ){
 
        HttpClient client; // web клиента
        HttpPost request; // POST запрос
        HttpResponse response; // объект ответа
        HttpEntity httpEntity; // http объект
        String content = null; // string ответ
        
        try {
 
            // создаем web клиента
            client = HttpClientBuilder.create().build();
 
            // формируем url запроса и создаем POST объект
            request = new HttpPost( this.url + "?key=" + key + "&method=" + method_name );
 
            // заполняем POST объект данными из входящего массива params
            request.setEntity(new UrlEncodedFormEntity(params));
 
            // выполняем запрос
            response = client.execute(request);
 
            // создаем http сущность ответа
            httpEntity = response.getEntity();
 
            // через утилиту EntityUtils конвертируем поток из http объекта ответа в string , с указанием кодировки
            content = EntityUtils.toString(httpEntity, "UTF-8");
 
        } catch (IOException e) {
            // в случае ошибки
            content = e.getMessage();
        }
 
        return content;
    }
 
}
p.s. может есть ide более "лучше" или просто я такой рукожоп ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2015, 00:01
Ответы с готовыми решениями:

(Android studio, java) Ошибка при импорте библиотеки cannot resolve symbol android studio
Вот библиотека https://github.com/mik3y/usb-serial-for-android. Устанавливал...

Не видны методы стандартной библиотеки Android studio
Пишу android приложение (Android studio).Подключаю стандартную библиотеку:...

Не предлагается установка Android SDK при установке Android Studio
на сайте https://developer.android.com/studio/... скачал exeшник для...

Android studio, как запускать программу сразу на android смартфоне подключенному к usb?
android studio, как запускать программу сразу на android смартфоне...

Ошибка в Android Studio Error:No resource identifier found for attribute 'appComponentFactory' in package 'android'
Доброго времени суток! При компиляции андроид приложении выходит данная...

14
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
31.10.2015, 10:44 2
С IDE все впорядке. Библиотеки можно подключить в dependencies
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
0
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
31.10.2015, 14:23  [ТС] 3
YuraAAA, хм... спасибо, но не помогло.

Удалил библиотеки которые сам закачал и вернул build.gradle в исходное состояние, далее добавил в блок dependencies:
compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
android studio что-то там грузил грузил в результате некоторые пакеты загрузились.
А вот эти все равно подсвечивает красным ( типо незнаю я что это ):
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClientBuilder;
Это ведь часто используемые библиотеки если вообще не стандартные, что так сложно то все...
Есть ли возможность скачивать библиотеки без ручного поправления этого файла ? выбирать к примеру из готового списка
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
31.10.2015, 15:40 4
gradus, из мавен репозитория можно. погугли.
0
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
31.10.2015, 18:49  [ТС] 5
Mikalai, ок посмотрю.

Но все же хочу уточнить, в приведенном моем примере нельзя просто к примеру: добавить строку в настройки и все заработает ?
Тоооооесть.... вот этим примитивным скриптом я выхожу за рамки возможностей android studio и начинаю искать стороннее ПО что бы тупо подключить стандартные библиотеки ?
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
31.10.2015, 20:54 6
Цитата Сообщение от gradus Посмотреть сообщение
вот этим примитивным скриптом я выхожу за рамки возможностей android studio
AS это просто удобная IDE. Наверное правильно сказать за рамки Android SDK. Но это всё лирика. Вот тут почитай про Apache HTTP.
0
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
01.11.2015, 17:06  [ТС] 7
Mikalai, уже прочитал про это и еще узнал что web запросы не могут применяться в основном потоке.

После установки useLibrary 'org.apache.http.legacy' соответственно пишет о deprecated на классы: HttpClient , HttpPost , HttpResponse , HttpEntity .

Вопрос: как по "модному" надо отправить post запросы ?)
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
01.11.2015, 17:20 8
gradus, вот. Можно поискать стороннюю библиотеку - лоадер какой-нить. Короче, как душе угодно.
0
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
02.11.2015, 16:53  [ТС] 9
В общем ладно, буду использовать DefaultHttpClient.
Раз уж надо делать в отдельном потоке запросы, то хочу сделать некий callback по результату.
Как я хочу сделать: вызываю метод для получения данных и в параметр этого метода передаю ссылку на метод который должен вызваться с полученным результатом.
Собственно вопрос, как сделать callback ?)
Что-то типо того:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MainActivity extends AppCompatActivity {
 
    public TextView TextLog;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        this.TextLog = (TextView) findViewById(R.id.textView);
 
        Button button = (Button) findViewById(R.id.button);
        
        button.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                //запускаем наш rest с Async
                rest api = new rest();
                api.execute( {ссылка на объект MainActivity и его метод input_user_name  } );
            }
        });
    }
    
    public void input_user_name(String user_name){
        this.TextLog.setText( user_name );
    }
}
Добавлено через 7 минут
Ну или может есть еще хорошие способы, только не сложные) я только начал изучать
Видел примеры где класс в классе, для меня это как-то не эстетично.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
02.11.2015, 16:57 10
Цитата Сообщение от gradus Посмотреть сообщение
Видел примеры где класс в классе, для меня это как-то не эстетично.
Можно внутренний класс вынести в отдельный файл. Правда возможно придется его допиливать, если он использует поля или методы родительского класса.
Цитата Сообщение от gradus Посмотреть сообщение
Ну или может есть еще хорошие способы, только не сложные
Есть
0
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
02.11.2015, 22:15  [ТС] 11
Spelcrawler, AsyncTask эт ж вроде абстрактный класс для отдельного потока. А как callback, то в нем сделать ?
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 670
02.11.2015, 22:37 12
gradus, тут почитай уроки 80-91.
1
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
03.11.2015, 13:06  [ТС] 13
В общем не работает и ошибок не пишет

Создал класс запроса:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class net extends AsyncTask<String, Void, String>  {
 
    Task CallBack;
 
    public net(Task CallBack){
        this.CallBack = CallBack;
    }
 
    protected void onPreExecute() {
      this.CallBack.before();
    }
 
    @Override
    protected String doInBackground(String... params) {
        
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost http = new HttpPost("http://127.0.0.1/");
        String response = null ;
 
        List nameValuePairs = this.CallBack.param_get();
 
        try {
            http.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            response = httpclient.execute(http, new BasicResponseHandler());
        } catch (UnsupportedEncodingException e) {
            this.CallBack.error("encode",  e.hashCode() + " " + e.getMessage() );
        }catch (IOException e) {
            this.CallBack.error("IOException",  e.hashCode() + " " + e.getMessage() );
        }
 
        this.CallBack.success(response);
 
        return response;
    }
 
    protected void onPostExecute(String res) {
        this.CallBack.Complete();
    }
}
Создал абстрактный класс:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public abstract class Task {
 
    private String result;
    private String errror_code;
    private String error_message;
 
    private List nameValuePairs = new ArrayList();
 
    final public void success(String result){
        this.result = result;
    }
 
    public void before(){}
 
    final public String getResult(){
        return this.result;
    }
 
    abstract void Complete();
 
    final public void error(String Code, String errorMessage){
        this.errror_code = Code;
        this.error_message = errorMessage;
    }
 
    final public void error(Integer Code, String errorMessage){
        this.error( Code.toString() , errorMessage );
    }
 
    final public boolean is_success(){
        return this.errror_code != null;
    }
 
    final public String get_error_message(){
        return this.errror_code + ": " + this.error_message;
    }
 
    final public void param_add(String key, String val){
        this.nameValuePairs.add(new BasicNameValuePair(key, val));
    }
 
    final public List param_get(){
        return this.nameValuePairs;
    }
}
Далее в MainActivity:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class MainActivity extends AppCompatActivity {
 
    public TextView TextLog;
    public EditText loginInput;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        this.TextLog = (TextView) findViewById(R.id.textView);
 
        this.loginInput = (EditText) findViewById(R.id.editText);
 
        Button button = (Button) findViewById(R.id.button);
 
        button.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
 
                String login = loginInput.getText().toString();
                auth authObj = new auth(login);
                new net(authObj);
            }
        });
    }
 
 
    class auth extends Task{
 
        public auth(String login){
            this.param_add("login", login);
        }
 
        public void Complete(){
            TextLog.setText( "Complate" );
        }
 
        public void before(){
            TextLog.setText( "start" );
        }
 
    }
}
Не срабатывают методы в подклассе auth: Complete , before
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
03.11.2015, 13:14 14
Цитата Сообщение от gradus Посмотреть сообщение
this.CallBack.success(response);
перенести в onPostExecute, иначе краш будет.

Цитата Сообщение от gradus Посмотреть сообщение
new net(authObj);
Java
1
new net(authObj).execute();
1
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
03.11.2015, 13:24  [ТС] 15
YuraAAA, а блин точно, про execute забыл )
Все круто, все работает. Всем большое спс)
0
03.11.2015, 13:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 13:24

Android.support.v4.app.FragmentActivity не работает в Android Studio
объясните пожалуйста,как в андроид студио добавить вышеуказанную...

Выбор мощного android смартфона до 10 рублей, для тестирования проектов Android Studio, что посоветуете?
Какую фирму посоветуете?

Запуск игры mr.Nom через Android Studio (по книге марио цехнер программирование игр под android)
Привет всем! Для тех кто читал книгу - в конце 6ой главы мы закончили писать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru