Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
gradus
0 / 0 / 0
Регистрация: 30.10.2015
Сообщений: 41
#1

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

31.10.2015, 00:01. Просмотров 2290. Ответов 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 (Программирование Android):

Не видны методы стандартной библиотеки Android studio - Программирование Android
Пишу android приложение (Android studio).Подключаю стандартную библиотеку: import android.bluetooth.BluetoothDevice; В мануалах к...

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

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

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

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

Подключение Android Annotations к Android Studio - Программирование Android
Каким образом это сделать? Есть два .jar файла: androidannotations-3.2.jar androidannotations-api-3.2.jar При подключении через...

14
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 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
259 / 235 / 95
Регистрация: 11.01.2015
Сообщений: 662
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
259 / 235 / 95
Регистрация: 11.01.2015
Сообщений: 662
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
259 / 235 / 95
Регистрация: 11.01.2015
Сообщений: 662
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
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 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
259 / 235 / 95
Регистрация: 11.01.2015
Сообщений: 662
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
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 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 Manifest в Android Studio - Программирование Android
Всем привет. Такой вопрос. Перешел c Eclipse на Android Studio и столкнулся со следующим: когда открываешь тот же манифест в AS, то...

Использование C# библиотеки в java android - Программирование Android
Всем привет) У меня есть библиотека, написанная на C#(конкретно для работы с XML (использую System.Xml.Linq)), и мне её нужно использовать ...

Использование библиотеки 47deg/android-swipelistview - Программирование Android
Добрый день. В своем проекте хочу использовать библиотеку android-swipelistview притягиваю ее с гитхаба а тама все в ерорах... Если кто то...

Android Studio - Программирование Android
Всем доброго времени суток. У меня вопрос. Скажите, как в Android Studio создать окно логина и пароля, чтобы он взаимодействовал с сервером...


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

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

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