You maybe install utorrent app, but you can't download torrent file in external storage installed android 6.0.1(marshmallow).
Edit packages.xml.
$ su
# vi /data/system/packages.xml
<package name="com.utorrent.client" codePath="/data/app/com.utorrent.client-1" nativeLibraryPath="/data/app/com.utorrent.client-1/lib" primaryCpuAbi="armeabi-v7a" publicFlags="940097092" privateFlags="0" ft="15a648b6388" it="15a648b6f1f" ut="15a648b6f1f" version="245" userId="10069" installer="com.android.vending">
...
<perms>
...
<item name="android.permission.ACCESS_WIFI_STATE" granted="true" flags="0" />
<item name="android.permission.WAKE_LOCK" granted="true" flags="0" />
<item name="android.permission.WRITE_MEDIA_STORAGE" granted="true" flags="0" />
</perms>
or hacking frameworks.
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 647c17b..1ec1fe7 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -22,6 +22,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
+import static android.Manifest.permission.WRITE_MEDIA_STORAGE;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER;
import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
@@ -1935,6 +1936,8 @@ final class Settings {
return;
}
+ boolean isMediaStoragePermission = false;
+
serializer.startTag(null, TAG_PERMISSIONS);
for (PermissionState permissionState : permissionStates) {
@@ -1943,6 +1946,19 @@ final class Settings {
serializer.attribute(null, ATTR_GRANTED, String.valueOf(permissionState.isGranted()));
serializer.attribute(null, ATTR_FLAGS, Integer.toHexString(permissionState.getFlags()));
serializer.endTag(null, TAG_ITEM);
+
+ if (!isMediaStoragePermission
+ && permissionState.getName().equals(WRITE_MEDIA_STORAGE)) {
+ isMediaStoragePermission = true;
+ }
+ }
+
+ if (!isMediaStoragePermission) {
+ serializer.startTag(null, TAG_ITEM);
+ serializer.attribute(null, ATTR_NAME, WRITE_MEDIA_STORAGE);
+ serializer.attribute(null, ATTR_GRANTED, "true");
+ serializer.attribute(null, ATTR_FLAGS, Integer.toHexString(0));
+ serializer.endTag(null, TAG_ITEM);
}
serializer.endTag(null, TAG_PERMISSIONS);
Automatically permission string is inserted in packages.xml.
After install app from Market you must reboot system.
2017년 2월 28일 화요일
2016년 12월 16일 금요일
How to install apps into SD card on ODROID-C2 marshmallow.
Install android 6.0.1 into 8GByte eMMC.
5GByte userdata.
Install many apps.
storage space running out.
Insert SD Card.
Use as internal storage.
Enable sdcard like internal storage.
Settings -> Apps -> Storage
Move "Angry Birds" to "SanDisk SD card".
2015년 8월 25일 화요일
Android File Chooser and URI to File Path.
파일을 Intent.ACTION_GET_CONTENT을 이용하여 선택하고 URI를 File Path로 변환하기
Image 나 Video 같은 파일을 얻어오는 예제는 많지만 일반 파일을 선택하는 예제가 없어서 며칠 찾아 보다가 직접 external.db에서 값을 얻어와야 한다는 결론을 얻었습니다.
/data/data/com.android.providers.media/databases 경로에 가면 모든 파일을 DB로 관리합니다.
root@odroidc:/data/data/com.android.providers.media/databases # ls -l
-rw-rw---- u0_a4 u0_a4 163840 2015-08-25 03:23 external.db
-rw-rw---- u0_a4 u0_a4 32768 2015-08-25 03:21 external.db-shm
-rw-rw---- u0_a4 u0_a4 28872 2015-08-25 03:21 external.db-wal
-rw-rw---- u0_a4 u0_a4 212992 2015-08-20 06:22 internal.db
-rw------- u0_a4 u0_a4 32768 2015-08-25 03:21 internal.db-shm
-rw------- u0_a4 u0_a4 453232 2015-08-25 03:21 internal.db-wal
root@odroidc:/data/data/com.android.providers.media/databases #
external.db를 sqliteman 프로그램을 이용하여 열어 보시면 아래와 같이 되어 있습니다.
files 테이블에 '_data'란 column에 실제 file path가 들어 있습니다.
private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
아래와 같이 할 경우 mime-type에 해당하는 파일만 선택 가능해 집니다.
intent.setType("application/zip");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
showFileChooser()를 실행하면 아래와 같은 file dialog가 실행 됩니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
URI -> real file path
String file_path = getRealPathFromURI(uri);
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
private String getRealPathFromURI(Uri uri) {
String filePath = "";
filePath = uri.getPath();
경로에 /storage가 들어가면 real file path로 판단
if (filePath.startsWith("/storage"))
return filePath;
String wholeID = DocumentsContract.getDocumentId(uri);
wholeID는 파일명이 abc.zip이라면 /document/B5D7-1CE9:abc.zip와 같습니다.
// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
Log.e(TAG, "id = " + id);
String[] column = { MediaStore.Files.FileColumns.DATA };
파일의 이름을 통해 where 조건식을 만듭니다.
String sel = MediaStore.Files.FileColumns.DATA + " LIKE '%" + id + "%'";
External storage에 있는 파일의 DB를 접근하는 방법 입니다.
Cursor cursor = getContentResolver().query(MediaStore.Files.getContentUri("external"),
column, sel, null, null);
SQL문으로 표현하면 아래와 같이 되겠죠????
SELECT _dtat FROM files WHERE _data LIKE '%selected file name%'
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}
Image 나 Video 같은 파일을 얻어오는 예제는 많지만 일반 파일을 선택하는 예제가 없어서 며칠 찾아 보다가 직접 external.db에서 값을 얻어와야 한다는 결론을 얻었습니다.
/data/data/com.android.providers.media/databases 경로에 가면 모든 파일을 DB로 관리합니다.
root@odroidc:/data/data/com.android.providers.media/databases # ls -l
-rw-rw---- u0_a4 u0_a4 163840 2015-08-25 03:23 external.db
-rw-rw---- u0_a4 u0_a4 32768 2015-08-25 03:21 external.db-shm
-rw-rw---- u0_a4 u0_a4 28872 2015-08-25 03:21 external.db-wal
-rw-rw---- u0_a4 u0_a4 212992 2015-08-20 06:22 internal.db
-rw------- u0_a4 u0_a4 32768 2015-08-25 03:21 internal.db-shm
-rw------- u0_a4 u0_a4 453232 2015-08-25 03:21 internal.db-wal
root@odroidc:/data/data/com.android.providers.media/databases #
external.db를 sqliteman 프로그램을 이용하여 열어 보시면 아래와 같이 되어 있습니다.
files 테이블에 '_data'란 column에 실제 file path가 들어 있습니다.
private static final int FILE_SELECT_CODE = 0;
private void showFileChooser() {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);
아래와 같이 할 경우 mime-type에 해당하는 파일만 선택 가능해 집니다.
intent.setType("application/zip");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(
Intent.createChooser(intent, "Select a File"),
FILE_SELECT_CODE);
} catch (android.content.ActivityNotFoundException ex) {
// Potentially direct the user to the Market with a Dialog
Toast.makeText(this, "Please install a File Manager.",
Toast.LENGTH_SHORT).show();
}
}
showFileChooser()를 실행하면 아래와 같은 file dialog가 실행 됩니다.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case FILE_SELECT_CODE:
if (resultCode == RESULT_OK) {
// Get the Uri of the selected file
Uri uri = data.getData();
URI -> real file path
String file_path = getRealPathFromURI(uri);
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
private String getRealPathFromURI(Uri uri) {
String filePath = "";
filePath = uri.getPath();
경로에 /storage가 들어가면 real file path로 판단
if (filePath.startsWith("/storage"))
return filePath;
String wholeID = DocumentsContract.getDocumentId(uri);
wholeID는 파일명이 abc.zip이라면 /document/B5D7-1CE9:abc.zip와 같습니다.
// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
Log.e(TAG, "id = " + id);
String[] column = { MediaStore.Files.FileColumns.DATA };
파일의 이름을 통해 where 조건식을 만듭니다.
String sel = MediaStore.Files.FileColumns.DATA + " LIKE '%" + id + "%'";
External storage에 있는 파일의 DB를 접근하는 방법 입니다.
Cursor cursor = getContentResolver().query(MediaStore.Files.getContentUri("external"),
column, sel, null, null);
SQL문으로 표현하면 아래와 같이 되겠죠????
SELECT _dtat FROM files WHERE _data LIKE '%selected file name%'
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}
피드 구독하기:
글 (Atom)