Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android. Показать все сообщения
Показаны сообщения с ярлыком android. Показать все сообщения

среда, 15 апреля 2020 г.

Android: root-доступ программно

#android #java

                    
Собственно вопрос: кто-нибудь смог получить права root на девайс программно?
Я видел скрипт на sh, с которым еще возиться и возиться, и это все что нагуглилось.
Видимо подобные вещи не афишируются и все же интерес огромный, ибо порой полезно, особенно
для написания системных тулз.    


Ответы

Ответ 1



Вы не смотрели пример DeviceAdmin из API Demos? Там для получения используется получение прав администратора через специальный диалог. Я точно не знаю то ли это, что вам нужно, но думаю может пригодиться ... В доках также пишут что есть возможность получить такие права, начиная с Android 2.2

Ответ 2



Получение привилегий делается через вызов системной программы su (например с помощью функции system или exec). В рутованный телефон эта программа устанавливается с suid-битами. Если взять данную программу из cyanogenmod, она предварительно спрашивает у пользователя, хочет ли он наделить привилегиями вызвавшее её приложение. Пример вызова из java: https://stackoverflow.com/a/8750977/1566316

SSH server на Android

#android #ssh #сервер

                    
Можно настроить ssh сервер на андроиде? Как?    


Ответы

Ответ 1



Можно установить приложение из Android Market: SSHDroid, которое реализует SSH-сервер для Android-телефона. Приложение сделано на основе Dropbear SSH.

Размещение созданной БД SQLite в проекте под Android

#android #java #sqlite #база_данных

                    
Здравствуйте. Пишу небольшой справочник, в основе которого будет база данных. Файл
БД создан на стороне средствами специального ПО. Данный файл нужно подгрузить в приложение
Android. Каким образом размещать файл, каков путь для доступа к внедряемой БД, какие
методы следует реализовать для обеспечения подключения и дальнейшей работы с данной
БД в приложении?    


Ответы

Ответ 1



Если ещё не читали, то будет полезна статья на Хабре «Правильная работа с БД в Android». Там же есть ссылка на тему прикрепления БД. Сам давно уже использую этот подход. Меня устраивает. Обсуждение тонкостей также производилось в вопросе «Правильная работа с SQLite-базой в Android».

Ответ 2



Базу на флешку. В приложении сделать выбор пути к базе.

Общие настройки для разных приложений

#android

                    
Добрый день всем.
Как можно сделать общий настройки для разных приложений.
Допустим в первом приложении ставим настройку.
И чтобы другое приложение могло ее считать?    


Ответы

Ответ 1



Существует ряд методов по работе с данными из приложения: Shared Preferences Internal Storage External Storage SQLite Databases Network Connection Из них только External Storage позволяет обращаться к данным из разных приложений. Поэтому можно поступить так: создать приложение, которое будет управлять настройками группы приложений, и обеспечить доступ к этим настройкам для других приложений, сделав его Content Provider'ом.

Ответ 2



А еще настройки можно хранить в облаке.

Проблема с AlertDialog

#android

                    
case IDD_SEND_SMS:
AlertDialog.Builder builder2 = new AlertDialog.Builder(this);
builder2.setMessage("Отправить смс на номер " + number + "?");
builder2.setPositiveButton("Да",
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            sendSMS(number, smsText);
        }
    });
builder2.setNegativeButton("Нет",
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });
builder2.setCancelable(true);
return builder2.create();

При повторном вызове сообщение остается тем же, что и было при 1-ом. Иначе говоря,
setMessage во 2-ой раз не срабатывает. Почему?    


Ответы

Ответ 1



Если этот код находится в onCreateDialog(), то проблема в том, что диалоги, созданные этим методом "кешируются". Из документации: If you use showDialog(int), the activity will call through to this method the first time, and hang onto it thereafter. Any dialog that is created by this method will automatically be saved and restored for you, including whether it is showing. Используйте метод onPrepareDialog() для того, чтобы изменить сообщение.

Таблица с заголовками столбцов

#android #java

                    
Как в Android создать таблицу с "шапкой"? Добавил в приложение таблицу с помощью
TableLayout, но такой возможности не нашел.    


Ответы

Ответ 1



Можно так: Будет отдельная таблица под шапку.

Ответ 2



А что мешает выделить особенным образом первую строку таблицы? Например шрифт сделать жирный, поставить рамку.

Как правильно записать в файл данные из EditText Android приложения на SD-карту

#android

                    
Приветствую. Как правильно записать в файл "test.txt" данные из EditText Android
приложения на SD-карту? В моем случае вываливается ошибка о прекращении процесса программы.
public void mNoteSaveClick(View v) {
    saveFile(FILEPATH + nnTitleText.getText().toString() + FILEEXT);
}

private void saveFile(String FileName) {
    boolean yoba;
    if (yoba = Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)) {
        try {
            OutputStream outStream = openFileOutput(FileName, 0);
            OutputStreamWriter sw = new OutputStreamWriter(outStream);
            sw.write(nnTitleText.getText().toString());
            sw.write(nnNoteText.getText().toString());
            sw.close();
        } catch (Throwable t) {
            Toast.makeText(getApplicationContext(),
                    "Exception: " + t.toString(), Toast.LENGTH_LONG).show();
        }
        Toast.makeText(getApplicationContext(), "Exception111",
                Toast.LENGTH_LONG).show();
    } else {
        Toast.makeText(getApplicationContext(), "Exception",
                Toast.LENGTH_LONG).show();
    }
}
    


Ответы

Ответ 1



Первым делом Вам надо убедиться, что в манифесте приложения выставлены требуемые права на запись на SD-карту, а именно WRITE_EXTERNAL_STORAGE ... После этого стандартная запись должна работать OutputStream os = new FileOutputStream ("/sdcard/filename"); try { byte[] buffer = new byte[256]; os.write(buffer, 0, buffer.length); } finally { os.close(); }

Жесты перелистывания

#gestures #android

                    
Есть массив с ссылками на изображения.
Есть ImageView.
Можем ли мы как-либо получить обработать жесть перелистывания влево и вправо и далее
менять изображение на нужное из массива? Интересует именно реализация жеста перелистывания.    


Ответы

Ответ 1



Можем, используя метод onFling: public class MyActivity extends Activity { private void onCreate() { final ImageView iv = (ImageView) findViewById(R.id.image_view); iv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent e) { gd.onTouchEvent(e); return true; } }); } private final GestureDetector gd = new GestureDetector(new GestureListener()); private static final int DISTANCE = 100; private static final int VELOCITY = 200; private class GestureListener extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(e1.getX() - e2.getX() > DISTANCE && Math.abs(velocityX) > VELOCITY) { // Справа налево return false; } else if (e2.getX() - e1.getX() > DISTANCE && Math.abs(velocityX) > VELOCITY) { // Слева направо return false; } return false; } } }

Ответ 2



Галерея не подходит?

понедельник, 13 апреля 2020 г.

Что возвращает строка Integer.valueOf(…)?

#android #java

                    
Не уверен, что получится без остального исходного кода, но получается слишком много кода.
Вопрос: что возвращает эта строчка:
res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());

И что за "count"? Это атрибут какой-то? Или блок в xml, который парсится? 
public static int numResults(Document doc){     
        Node results = doc.getDocumentElement();
        int res = -1;

        try{
            res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue());
        }catch(Exception e ){
            res = -1;
        }

        return res;
    }

Это потом проверяется в активити
 if((numResults <= 0)){
        Toast.makeText(Main.this, "Geen resultaten gevonden", Toast.LENGTH_LONG).show();  
        finish();
    }

И больше - ни слово про эту функцию...Вот я и ломаю голову...Уже второй день пытаюсь
парсинг скопипастить...Знания java не хватает к написанию самостоятельно...    


Ответы

Ответ 1



Integer.valueOf - это преобразовать аргумент (который в данном случае - целое или строка) в целое. В данном случае аргумент с большой вероятностью - строка. Конструкция results.getAttributes().getNamedItem("count").getNodeValue()) - это действительно похоже на парсинг xml.

JAVAH не может найти требуемый класс

#android_ndk #android #java

                    
При запуске javah -jni команда наотрез отказывается находить нужный класс:

$PROJECT_DIRECTORY/bin$
javah -jni
bt.nativeclient.BtnativeActivity
error: cannot access
bt.nativeclient.BtnativeActivity class
file for
bt.nativeclient.BtnativeActivity not
found javadoc: error - Class
bt.nativeclient.BtnativeActivity not
found. Error: No classes were
specified on the command line.  Try
-help

Мой класс java имеет аддрес: $PROJECT_DIRECTORY/src/bt/nativeclient/BtnativeActivity.java
и имеет вид:
package bt.nativeclient;

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView;

public class **BtnativeActivity** extends Activity   { 
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
    }

    public native String stringFromJNI();

    static 
    {
        System.loadLibrary("hello-jni");
    }  
}

Я пробовал запускать javah из: $PROJECT_DIRECTORY/bin, $PROJECT_DIRECTORY/src, просто
из $PROJECT_DIRECTORY. Я пробовал специфицировать путь для поиска класса через опцию
-classpath:
$PROJECT_DIRECTORY/src javah -classpath :. bt.nativeclient.BtnativeActivity

Более того, если включить опцию -verbose команда javah говорит, что она исказала
мой класс в той директории, где этот самый класс она должна была найти:

$PROJECT_DIRECTORY
**javah -verbose -classpath :./src -jni**
**bt.nativeclient.BtnativeActivity** error: cannot access
bt.nativeclient.BtnativeActivity class
file for
bt.nativeclient.BtnativeActivity not
found javadoc: error - Class
bt.nativeclient.BtnativeActivity not
found. [ **Search Path**:
/usr/lib/jvm/java-6-openjdk/jre/lib/resources.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jsse.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/jce.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/charsets.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/netx.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/plugin.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar:/usr/lib/jvm/java-6-openjdk/jre/lib/modules/jdk.boot.jar:/usr/lib/jvm/java-6-openjdk/jre/classes/:**./src**
]

Я перепробовал все возможные комбинации, но не нашел решения.
Мне кажется, я упустил какую-то маленькую деталь по своей неопытности, может кто-нибуть
помочь мне, пожалуйста?    


Ответы

Ответ 1



Надо указывать пусть к .class файлу, они не в bin а в bin\classes. Класспас указывает не на ваш исходних а на дополнительные библиотеки, если их нет, то просто из папки bin\classes вызовите команду >javah <пакет>.<пакет>.<класс> Должно работать.

Рисование на виджете канвасом

#widgets #android #java

                    
Всем привет. Я уже задавал такой вопрос, но ответа так и не получил, задаю еще раз
:) Я пытаюсь нарисовать на виджете линию, круг или прямоугольник через канву, но ничего
не получается....
UPD:
решение найдено http://dajver.blogspot.com/2012/04/canvas-android.html    


Ответы

Ответ 1



А причем тут AppWidgetProvider? AppWidgetProvider нечто похожее на BroadcastReceiver - по сути некий сервис, который говорит "я умею показывать виджет", но он сам не рисует виджет! Это провайдер! Чтобы нарисовать виджет надо составить кастомный класс наследующий от View и в его методе onDraw() написать то что хотите. Вам уже в прошлый раз камрады указывали на вашу ошибку. Есличо смотрите пример реализации кастомного виджета здесь Update public class MySuperPuperWidgetView extends SomeExistingWidgetView { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //рисуем виджет //далее пишем свою хрень на канвасе } }

Как восстановить R.java?

#android #java

                    
После очистки android-проекта пропал R.java файл.Соответственно, запустить проект
не могу...
Раз 20 делал очистку, файл не появляется.
Может кто подскажет, как восстановить его?    


Ответы

Ответ 1



Проверьте ошибки в хмл файлах разметки. Ошибки в классах. Запустите еще раз.

Ответ 2



Попробуй создать новый проект с помощью импорта или просто скопировав весь код. По идее должно все получиться =)

Ответ 3



Самый верный способ это сгенерировать вручную через aapt: $aapt package -m -J -M AndroidManifest.xml -S res -I /platforms/android-xx/android.jar SOURCE_FOLDER - каталог с исходниками SDK_PATH - путь к SDK Android'а xx - номер API А вообще скорее всего у вас ошибка в AndroidManifest.xml - проверьте еще раз

Ответ 4



R.java - это файл который генерируется автоматически, ничего руками вносить или изменять в нем не нужно. Если у Вас проект без ошибок просто обновите список папок и все. Если R.java не генерируется и у Вас весь проект в ошибках, смотрите в лог Console (это если в Eclipse работаете)там написано в каком файле ошибка. Исправьте её и R.java сам появится.

Как программно запускать браузер из приложения и закрывать его, когда пользователь что-либо скачает?

#android_sdk #android

                    
Мне необходимо сделать так, что бы при нажатии на кнопку открывался браузер и пользователь
мог скачать файл и когда хотя бы один из файлов будет скачан - браузер должен закрываться
и далее запустившее его прилодение должно получать передний план и имя скаченного файла.
Подскажите, пожалуйста, как правильно специфицировать объект Intent для того, что
бы реализовать данный функционал.
Просто запустить браузер не составляет сложности, однако мне нужна Ваша помощь в
реализации вышеописанного оповедения.     


Ответы

Ответ 1



Стандартно делается это так: 1) Интент new Intent(Intent.ACTION_VIEW, Uri.parse(url)) далее запуск активити браузера через startActivityForResult 2) Вызвавший интент активити по окончании работы браузера получит onActivityResult, где вы сможете в зависимости от результата выставить сообщение или что там у вас. По параметрам и проч. см. в документации. Но есть одна трабла - заставить браузер закрыться после окончания скачивания - это вряд ли... Есть конечно варианты реализации функционала другим способом: Напрямую выкачивать минуя браузер Выкачивать через WebView (по сути все тот же браузер, только как часть вашей проги)

Android: Preferences

#android_sdk #android #eclipse #java

                    
Проблемы с Preferences.
Есть 2 активности (класса). В одной ключ "number" равен 0,а в другой (в которой я
работал с этим ключом) = 2.
(Я при запуске программы выгружаю ключи). Код одинаковый и в одинаковых местах (OnCreate),
разные только имена переменных:
notes = getPreferences(MODE_WORLD_WRITEABLE);
            Editor ed = notes.edit();
        textView1.setText(String.valueOf(notes.getInt("number", 0)));
    


Ответы

Ответ 1



SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String val = prefs.getString("number", ""));

Файлы данных для android-приложения.

#android #jni

                    
Пишу приложение с использованием jni. Библиотеке на C++ требуются файлы с данными.
Как их добавить в проект, и как их можно будет открывать из jni?    


Ответы

Ответ 1



Вот пример: тыц Добавляете в assets, а дальше используете обычный апи только сишный. Как пример выше по ссылке. Там пишется файл с данным и создается директория. Если я конечно правильно понял ваш вопрос. UPD Туда же: тыц-два

Ответ 2



В общем скомбинировал и обработал найденное на stackoverflow. Получилось следующее. В классе наследованном от Activity. private void assetsToFiles() throws IOException { // распаковать файлы из assets File dir = getFilesDir(); AssetManager assetManager = getAssets(); String[] files = null; files = assetManager.list(""); byte[] buffer = new byte[1024]; for(String filename : files) { File outfile = new File(dir, filename); if(outfile.exists()) continue; InputStream in; try{ in = assetManager.open(filename, AssetManager.ACCESS_STREAMING); }catch (java.io.FileNotFoundException e) { continue; } OutputStream out = new FileOutputStream(outfile); int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } in.close(); out.close(); } } Эту функцию вызываю из onCreate. Нужные файлы помещаю в проекте в каталог assets. А программе их следует искать в каталоге, путь к которому возвращает getFilesDir(). Блок try пришлось сделать из-за того, что assetManager.list почему-то возвращает в списке несуществующее имя "images".

Как сделать Get-запрос?

#java #android

                    
Как сделать get-запрос на Java для Android и получить ответ?    


Ответы

Ответ 1



Создать новый объект URL и вызвать на нем метод .openStream() new URL("http://hashcode.ru").openStream()

Как менять внешний вид пункта ListView при клике на него?

#android #listview #java

                    
При разработке приложения столкнулся с такой проблемой. У меня есть ListView. Нужно,
чтобы при клике на пункт, этот пункт менял свой внешний вид (цвет текста), а при повторном
клике возвращался в обычное состояние. Сложность в том, что это должно сохраняться,
т.е. при перезапуске приложения, внешний вид пунктов должен быть такой же как при закрытии.
P.S. Пункты списка тянутся из базы, если это чем-то поможет.    


Ответы

Ответ 1



Надо примерно так: Декларируем лэйаут TextView (my_text_view.xml) Заводим списочек: ListView listView = new ListView(context); String[] items = {"Item 1","Item 2", "Item 3"}; ArrayAdapter adapter = new ArrayAdapter(context,R.layout.my_text_view,items); listView.setAdapter(ad); Далее при клике на элемент: listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long i) { ((TextView) view).setTextColor(anyColor); //вставляем свой цвет } });

Как запустить виджет в Android-эмуляторе?

#android_sdk #android

                    
Вот сделал я Android виджет. Хочу добавить его на хоумскрин, но при добавлении не
вижу. При запуске в эклипсе вот что пишет:  



Что делать? Как быть?
    


Ответы

Ответ 1



Попробуй длинный тычок на пустое место, куда добавил виджет. Если появится контекстное меню или таскалка - значит, виджет добавился, но невидимый (с прозрачной картинкой) - т.е. ты что-то напутал с ресурсом, который у тебя на виджете должен отображаться. Еще была пара случаев, когда это случалось совсем спонтанно, помогал клин-редеплой. Возможно, sdk глюкнуло и забыло упаковать картинку в apk. // FIXME В след. раз лучше делай скриншот вкладки LogCat, в логе консоли видно только установку приложения

VideoView: закрытие Activity после окончания проигрывания файла

#android #videoview #java

                    
Народ, подскажите, пожалуйста, как закрыть Activity по окончании проигрывания. Вот
мой код:
final VideoView myVideoView = (VideoView) findViewById(R.id.videoViewPresentation);

video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.video);

myVideoView.setVideoURI(video);
myVideoView.setMediaController(new MediaController(this));
myVideoView.requestFocus(0);

t = new Thread(new Runnable() {
    public void run() {
        myVideoView.start();
    }
});

t.start();
    


Ответы

Ответ 1



Надо слушать листенер окончания проигрывания и там убивать активити. videoView.setOnCompletionListener()

Парсинг XML

#xml #android #синтаксический_анализ

                    
Работаю на андроид с Xml. Столкнулась с тем, что мне нужно парсить xml такого вида:




Понимаю, как достать текст, атрибуты, а как мне достать слово "Пример"?    


Ответы

Ответ 1



Надо парсить SAX'ом, простейший пример использования здесь Касаемо секции CDATA ее надо ловить в хэндлере DefaultHandler.characters(), причем с конкатенацией, поскольку он может вызываться несколько раз. P.S. @atnartur неправ, поскольку парсер вернет без , вернет только Пример

Ответ 2



Простой пример Serializing with CDATA blocks http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php