Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
JIyrApy
34 / 34 / 2
Регистрация: 22.08.2010
Сообщений: 260
#1

Программное копирование файлов - Программирование Android

28.04.2013, 13:01. Просмотров 2453. Ответов 10
Метки нет (Все метки)

Здравствуйте. Общий принцип кода такой:
1) находим в списке установленных приложений необходимое мне:
Java
1
2
3
4
5
6
7
8
9
10
11
PackageManager packageManager = getPackageManager();
            List <ApplicationInfo> allApplication = packageManager.getInstalledApplications(0);
            for(int kk=0; kk<allApplication.size(); kk++){
 
                if(allApplication.get(kk).packageName.contains("<название_пакета>")){
                    existApp=true;
                    liteData=allApplication.get(kk).dataDir.trim(); 
                    break;
 
                }  
            }
2) если приложение нашлось (existApp=true), то проверяю существует ли у этого приложения файл БД и если есть, то копирую эту БД:
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
// метод для проверки существования файла
        public boolean chchFile(String fileName){
            File dbFile = new File(fileName);
            if(dbFile.exists()){
                return true;
            }else{
                return false;
            }
}
 
//копирование файлов
        public boolean copyFile(File source, File dest) {
            FileInputStream is = null;
            FileOutputStream os = null;
            try {
                is = new FileInputStream(source);
                os = new FileOutputStream(dest);
                int nLength;
                byte[] buf = new byte[8000];
                while (true) {
                    nLength = is.read(buf);
                    if (nLength < 0) {
                        break;
                    }
                    os.write(buf, 0, nLength);
                }
                return true;
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {
                if (is != null) {
                    try {
                        is.close();
                    } catch (Exception ex) {
                    }
                }
                if (os != null) {
                    try {
                        os.close();
                    } catch (Exception ex) {
                    }
                }
            }
            return false;
        }
 
.......
//сама проверка приложения и БД
if(existApp){
  if(chchFile(liteData+"/databases/"+<название файла БД>)){
     copyFile(new File(liteData+"/databases/"+<название файла БД), new File(<место на sd-карте>)); // копируем БД
 
  }
}
Но в результате срабатывает catch (IOException ex) метода copyFile и ошибка
java.io.FileNotFoundException: /data/data/<пакет приложения>/databases/<название_БД>
Получается, что файла как бы не существует. Но как такое может быть? Ведь если бы его не существовало, то при проверке условия вышибало бы уже, а тут в метод копирования заходит и дальше все. Причем БД физически существует по данному пути. В чем ошибка, никак не могу разобраться?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2013, 13:01
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Программное копирование файлов (Программирование Android):

Программное масштабирование
Доброе время суток. Возникла проблема с масштабированием при поддержки разных...

Программное создание экрана
Всем доброго дня! Коллеги. Так получилось что в программе приходится рисовать...

Программное завершение приложения
Здравствуйте. Как программно завершить приложение? То есть не завершить...

Программное добавление элементов
Уважаемы подскажите такую ситуацию, не могу немного понять...Как на Relative...

Программное создание TextView
Всем привет! помогите пожалуйста. Как сделать по нажатию на кнопку...

Программное открытие NavigationDrawer
Здравствуйте, пытался открыть Drawer программно получаю...

10
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 13:09 #2
а пермишены на чтение/запись есть?
а файл /data/data/<пакет приложения>/databases/<название_БД> для публичного доступа?
0
JIyrApy
34 / 34 / 2
Регистрация: 22.08.2010
Сообщений: 260
28.04.2013, 13:13  [ТС] #3
Пермишн стоит такой:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
а как узнать доступ к файлу на эмуляторе? Или как можно установить права доступа программно?

а нашел, -rw-rw---
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 13:32 #4
Цитата Сообщение от JIyrApy Посмотреть сообщение
Пермишн стоит такой:
а пермишен на чтение?

Цитата Сообщение от JIyrApy Посмотреть сообщение
а как узнать доступ к файлу на эмуляторе? Или как можно установить права доступа программно?
ну вот так создается файл с запретом доступа извне:
Java
1
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
подробнее здесь.

Добавлено через 9 минут
создание БД с модом доступа http://developer.android.com/referen...CursorFactory)
0
JIyrApy
34 / 34 / 2
Регистрация: 22.08.2010
Сообщений: 260
28.04.2013, 13:33  [ТС] #5
Это на openFileOutput, а для openFileInput - только один параметр, имя файла. И потом, система ругается именно на входящий файл, что типа его нету. Поставил пермишн READ_EXTERNAL_STORAGE - не помогло

Что-то ссылка не открывается, пустая страница
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 13:35 #6
не работает ссылка выше, зайдите сюда http://developer.android.com/reference/android/content/Context.html и ищите public abstract SQLiteDatabase openOrCreateDatabase (String name, int mode, SQLiteDatabase.CursorFactory

Добавлено через 39 секунд
Цитата Сообщение от JIyrApy Посмотреть сообщение
Это на openFileOutput, а для openFileInput - только один параметр,
мод указывается только при создании файла.
0
JIyrApy
34 / 34 / 2
Регистрация: 22.08.2010
Сообщений: 260
28.04.2013, 15:10  [ТС] #7
Использую SQLiteOpenHelper, который содержит в себе openOrCreateDatabase и всегда по умолчанию ставится Private режим (если верить гуглу)
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 15:18 #8
используйте openOrCreateDatabase класса Context о котором я выше написал, там можно ставить мод.
1
JIyrApy
34 / 34 / 2
Регистрация: 22.08.2010
Сообщений: 260
28.04.2013, 19:37  [ТС] #9
Эх, это получается весь код перелопачивать...
Ясно, спасибо. Что самое интересное, если копировать файл БД из приложения-родителя этой БД в какое-нить место на карточке, например, то потом эту копию можно копировать из другого приложения куда хочешь. Но напрямую, из data/data/... не копирует...
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 19:45 #10
ну да, екстернал сторедж доступен всем, а интернал по умолчанию только апликейшену владельцу.
можете посылать броткаст приложению чтобы оно скопировало свою базу на сд карту, по тотом с карты копировать.
0
JIyrApy
34 / 34 / 2
Регистрация: 22.08.2010
Сообщений: 260
29.04.2013, 12:29  [ТС] #11
попробовал реализовать броткаст.
приемник:
xml
XML
1
2
3
4
5
<receiver android:name="<имя_пакета>.CopyReceiver"> 
           <intent-filter>
               <action android:name="com.my.action" />
           </intent-filter>
        </receiver>
класс:
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
public class CopyReceiver extends BroadcastReceiver {
 
    @Override
    public void onReceive(Context context, Intent intent) {
        String appl=intent.getExtras().getString("appl");
        if(appl.contains("<строка>")){
            String dbpath=appl;
            if(dbpath.contains("<строка>")){
                Log.e("MyLogs", dbpath);
               if(chchFile(dbpath)){
                   try {
                     copyDBFile(dbpath, <путь_копирования>);
                    } catch (IOException e) {
                     e.printStackTrace();
                    }
               }
            }
        }
        
    }
    
    // метод для проверки существования файла
            public boolean chchFile(String fileName){
                тут код для проверки файлов
            }
            
            
            //копирование файлов
            public boolean copyFile(File source, File dest) {
                тут код для копирования файлов
            }
            
            // метод для подготовки к копированию файлов
            public boolean copyDBFile(String inFile, String outFile) throws IOException{
                тут код для подготовки к копированию, вызывающий copyFile
            }
 
}
передачик:
Java
1
2
3
Intent intent = new Intent("com.my.action");
                intent.putExtra("appl", <путь_откуда копируем>);
                sendBroadcast(intent);
но в результате выдается ошибка при запуске приложения приемника (типа такое-то приложение было заверешно), в логах пусто.
0
29.04.2013, 12:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2013, 12:29
Привет! Вот еще темы с решениями:

Программное удаление приложения
Реально ли из android-приложения деинсталлировать другое android-приложение?

Программное добавление View
Не могу разобраться: нужно программно прилепить н-ное количество вьюх. Делаю...

Программное добавление View
Всем привет! У меня в роли setContentView выступает класс Draw2D, в котором я...

Программное создание интерфейса
Вобщем мне нужно создавать програмным способом интерфейс приложения. Обьекты...


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

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

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