среда, 21 августа 2013 г.

Шагаем в Android

Первые шаги в Android

будет постепенно изменяться и дополняться по мене вникания в процесс :)

Злостная Android Studio

Эта "сильная пре-альфа" отказывается нормально работать не только без интернета, но и с прокси. Источник бед — maven, который лезет за обновлениями gradle при каждом создании, а то и открытии проекта. На данный момент победить получилось только настройкой прозрачного прокси через iptables:
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination SQUID_IP:PORT

После этого все данные gradle смогли таки скачаться и новый проект был успешно создан…

Dropbox в Android Studio

Подключение библиотек оказалось не слишком тривиальной задачей :(

1. Качаем SDK и куда-нибудь распаковываем
2. В папке проекта AppNameProject/AppName создаём папочку libs и копируем в неё содержимое libs из SDK.
3. В дереве проекта студии находим AppName/libs/dropbox-sync-sdk-android.jar, правый клик, "Add as Library..."
4. Открываем на редактирование AppName/build.gradle
4.1. Добавляем в блок dependencies строку про нашу библиотеку. Должно получиться так:
dependencies {
    compile 'com.android.support:support-v4:18.0.0'
    compile files('libs/dropbox-sync-sdk-android.jar')
}

4.2. Добавляем копирование нативных библиотек, иначе ничего не будет запускаться:
task copyNativeLibs(type: Copy) {
    from(new File('libs')) { include '**/*.so' }
    into new File(buildDir, 'native-libs')
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
    pkgTask.jniDir new File(buildDir, 'native-libs')
}

После этого запускаем сборку и повторяем п.п. 2-4 до просветления. Порой, приходится лезть в настройки проекта (F4), удалять добавленную библиотеку и добавлять всё это заново.

Кусочки полезных функций

Убрать заголовок окна:

//...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_main);
//...

Получить список СМС с именами контактов:

// AndroidManifest.xml

    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
//main.java

// smslist = new ArrayList<arraylist<SMSData>>();
// используется в ExpandableList
Uri uri = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uri, null, null, null, "date DESC" );

if (c != null) {
   if (c.moveToFirst()) {
       /* SMS fields:
         _id, thread_id, address, person, date, date_sent, protocol, read, status, type,
         reply_path_present, subject, body, service_center, locked, error_code, seen
       */

       try {
          for(int i=0; i< c.getCount(); i++) { // do..while(c.MoveToNext() работает странно :(
              if (stop_sms_fill) break;

              SMSData sms = new SMSData();
              sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
              sms.setSender(c.getString(c.getColumnIndexOrThrow("address")).toString());
              sms.set_id(c.getInt(c.getColumnIndexOrThrow("_id")));
              sms.setThread(c.getInt(c.getColumnIndexOrThrow("thread_id")));

              // Person lookup
              Uri plook = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
                                                sms.getSender().toString());
              Cursor pc = getContentResolver().query(plook,
                                                new String[]{ContactsContract.Data.DISPLAY_NAME},
                                                null, null, null);

              try {
                  pc.moveToFirst();
                  sms.setPerson(pc.getString(0));
              }
              catch (android.database.CursorIndexOutOfBoundsException e) {
                  sms.setPerson("");
              }
              catch (Exception e) {
                  Log.e("AV", "Find person fail: " + e.getClass() + ", " + e.getLocalizedMessage());
                  sms.setPerson("");
              }
              finally {
                  pc.close();
              }

              // End person lookup

              Log.d("AV", "Person: " + c.getString(c.getColumnIndexOrThrow("person")));

              for (ArrayList<SMSdata> a : smslist) {
                 if (stop_sms_fill) break;
                 Log.d("AV", "Enum group " + a.get(0).getSender());
                 for (SMSData sd : a) {
                    if (stop_sms_fill) break;
                       Log.d("AV", "CMP '" + sd.getSender() + "' vs '" + sms.getSender() +"'");
                       if (sd.getThread() == sms.getThread()) {
                          Log.d("AV", "Add " + sms.getPerson() + " to " + sms.getSender());
                          a.add(sms);
                          sms = null;
                          break;
                       }
                    }
                    if (sms == null) break;
                }

                if (sms != null) {
                   Log.d("AV", "Add Group " + sms.getSender());
                   ArrayList<SMSdata> a = new ArrayList<SMSdata>();
                   a.add(sms);
                   smslist.add(a);
                }
                c.moveToNext();
             }
          }
          catch (Exception e) {
             Toast t = Toast.makeText(this, "Failed to fill SMS list: "+ e.getLocalizedMessage(), Toast.LENGTH_SHORT);
             t.show();
             Log.e("AV", "Exception in fill SMS list: " + e.getLocalizedMessage());
             return false;
          }
          finally {
             c.close();
          }
      }
  }
//...
.

1 комментарий:

  1. Online Gambling with PayPal | JT Hub
    Play slots and live 공주 출장안마 casino games using PayPal and 강원도 출장마사지 other payment 보령 출장샵 methods at JT Hub. Join today and get your 순천 출장안마 100% up 익산 출장마사지 to £100 free and

    ОтветитьУдалить