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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.94
JIyrApy
31 / 31 / 1
Регистрация: 22.08.2010
Сообщений: 242
28.04.2013, 13:01     Программное копирование файлов #1
Здравствуйте. Общий принцип кода такой:
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/<название_БД>
Получается, что файла как бы не существует. Но как такое может быть? Ведь если бы его не существовало, то при проверке условия вышибало бы уже, а тут в метод копирования заходит и дальше все. Причем БД физически существует по данному пути. В чем ошибка, никак не могу разобраться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 13:09     Программное копирование файлов #2
а пермишены на чтение/запись есть?
а файл /data/data/<пакет приложения>/databases/<название_БД> для публичного доступа?
JIyrApy
31 / 31 / 1
Регистрация: 22.08.2010
Сообщений: 242
28.04.2013, 13:13  [ТС]     Программное копирование файлов #3
Пермишн стоит такой:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
а как узнать доступ к файлу на эмуляторе? Или как можно установить права доступа программно?

а нашел, -rw-rw---
V0v1k
1157 / 981 / 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)
JIyrApy
31 / 31 / 1
Регистрация: 22.08.2010
Сообщений: 242
28.04.2013, 13:33  [ТС]     Программное копирование файлов #5
Это на openFileOutput, а для openFileInput - только один параметр, имя файла. И потом, система ругается именно на входящий файл, что типа его нету. Поставил пермишн READ_EXTERNAL_STORAGE - не помогло

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

Добавлено через 39 секунд
Цитата Сообщение от JIyrApy Посмотреть сообщение
Это на openFileOutput, а для openFileInput - только один параметр,
мод указывается только при создании файла.
JIyrApy
31 / 31 / 1
Регистрация: 22.08.2010
Сообщений: 242
28.04.2013, 15:10  [ТС]     Программное копирование файлов #7
Использую SQLiteOpenHelper, который содержит в себе openOrCreateDatabase и всегда по умолчанию ставится Private режим (если верить гуглу)
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 15:18     Программное копирование файлов #8
используйте openOrCreateDatabase класса Context о котором я выше написал, там можно ставить мод.
JIyrApy
31 / 31 / 1
Регистрация: 22.08.2010
Сообщений: 242
28.04.2013, 19:37  [ТС]     Программное копирование файлов #9
Эх, это получается весь код перелопачивать...
Ясно, спасибо. Что самое интересное, если копировать файл БД из приложения-родителя этой БД в какое-нить место на карточке, например, то потом эту копию можно копировать из другого приложения куда хочешь. Но напрямую, из data/data/... не копирует...
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.04.2013, 19:45     Программное копирование файлов #10
ну да, екстернал сторедж доступен всем, а интернал по умолчанию только апликейшену владельцу.
можете посылать броткаст приложению чтобы оно скопировало свою базу на сд карту, по тотом с карты копировать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2013, 12:29     Программное копирование файлов
Еще ссылки по теме:

Android Программное создание TextView
Android Программное наполнение GridLayout
Android Программное удаление SMS
Программное добавление элементов Android
Android Программное добавление View

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

Или воспользуйтесь поиском по форуму:
JIyrApy
31 / 31 / 1
Регистрация: 22.08.2010
Сообщений: 242
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);
но в результате выдается ошибка при запуске приложения приемника (типа такое-то приложение было заверешно), в логах пусто.
Yandex
Объявления
29.04.2013, 12:29     Программное копирование файлов
Ответ Создать тему
Опции темы

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