标签: android-sdcard

无法在Android模拟器中写入SD卡

我在AndroidManifest.xml中添加了这一行:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

但是,当我运行代码写入SD卡时,我收到此错误:

02-19 13:24:46.760: E/CameraTest(598): /mnt/sdcard/image.jpg: open failed: EACCES (Permission denied)
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

编辑:我正在使用添加了SDCard的Android模拟器.

编辑2:我知道现在的问题是:我已经调用了函数Environment.getExternalStorageState(),我被"删除"了.任何人都知道如何解决这个问题并建立状态MEDIA_MOUNTED

谢谢!

permissions android android-emulator android-sdcard

11
推荐指数
1
解决办法
2万
查看次数

将android:installLocation从preferExternal更改为internalOnly

我在Google Play市场上有一个应用程序,我添加android:installLocation="preferExternal"到manifest.xml文件并很久以前发布.现在我想添加Android主屏幕小部件,所以我需要将其更改为android:installLocation="internalOnly".如果我这样做,用户升级时会发生什么?因为用户已在SD卡上安装了旧应用程序.这种情况的最佳解决方案是什么?

如果有人有这种经历,请告诉我.

提前致谢 :)

installation android android-widget android-sdcard

11
推荐指数
1
解决办法
2949
查看次数

来自树URI的Android 5.0 DocumentFile

好吧,我进行了搜索和搜索,没有人得到我的确切答案,或者我错过了.我让我的用户通过以下方式选择目录:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, READ_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

在我的活动中,我想捕捉实际路径,这似乎是不可能的.

protected void onActivityResult(int requestCode, int resultCode, Intent intent){
    super.onActivityResult(requestCode, resultCode, intent);
    if (resultCode == RESULT_OK) {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
            //Marshmallow 

        } else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
            //Set directory as default in preferences
            Uri treeUri = intent.getData();
            //grant write permissions
            getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            //File myFile = new File(uri.getPath()); 
            DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
Run Code Online (Sandbox Code Playgroud)

我选择的文件夹位于:

Device storage/test/
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下所有方法来获得确切的路径名称,但无济于事.

File myFile = new File (uri.getPath());
//returns: /tree/1AF6-3708:test

treeUri.getPath();
//returns: /tree/1AF6-3708:test/

pickedDir.getName()
//returns: …
Run Code Online (Sandbox Code Playgroud)

storage android android-sdcard documentfile

11
推荐指数
2
解决办法
8958
查看次数

将文本文件写入SD卡失败

我遇到一个奇怪的问题.我的应用程序可以写一个简单的文本文件到SD卡,有时它适用于一些人,但不适用于其他人,我不知道为什么.

对于某些人来说,如果他们...在文件中放置一些字符等强制关闭它.我似乎无法重现它,因为我没有麻烦,但这是处理文件写入的代码.任何人都可以想到可能导致问题的事情或更好的方法吗?

public void generateNoteOnSD(String sFileName, String sBody)
{
    try
    {
        File root = new File(Environment.getExternalStorageDirectory(), "Notes");
        if (!root.exists()) 
        {
            root.mkdirs();
        }

        File gpxfile = new File(root, sFileName);
        FileWriter writer = new FileWriter(gpxfile);
        writer.append(sBody);
        writer.flush();
        writer.close();

        Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show();
    }
    catch(IOException e)
    {
         e.printStackTrace();
         importError = e.getMessage();
         iError();
    }
}   
Run Code Online (Sandbox Code Playgroud)

android android-sdcard android-file

10
推荐指数
3
解决办法
4万
查看次数

Android:.nomedia被忽略,图片仍然出现在图库中

我正在构建一个从Web下载图像并将它们存储到我的SD卡中的应用程序,为了使它们在库中不可见,我将这一行生成一个.nomedia文件:

FileWriter f = new FileWriter("/sdcard/Android/data/CopyImage/cache/.nomedia");
Run Code Online (Sandbox Code Playgroud)

应用程序可以成功下载图像并将.nodata文件放在同一个文件夹中,但事实是,图像仍然出现在图库中.

怎么会这样?任何人都可以为我提供解决方案吗?

非常感谢你

android android-sdcard android-gallery

10
推荐指数
2
解决办法
2万
查看次数

在Android上查找SD卡卷标

是否有可能找到插入Android设备的SD卡的卷标?

据我所知,Android设计只有一个"外部存储"(如返回Environment.getExternalStorageDirectory()),但有很多设备在内部将内部闪存作为"外部存储",并在其下安装SD卡或甚至更复杂的组合(见另一个问题).可以通过阅读来枚举这些附加设备/proc/mounts,但我们需要一些东西来识别用户.有没有机会获得他们的卷标?

我检查了Linux vfat驱动程序完全忽略了卷标签dentry,而且blkid从util-linux 读取了vfat本身.我还检查过,至少在我的设备上,SD卡的块设备有模式660和所有者root.root,所以我不能这样做.所以基本上它归结为是否有任何可以读取它的实用程序.

linux android android-sdcard

10
推荐指数
1
解决办法
6546
查看次数

如何获取存储在SDCARD上的图像的Uri?

我需要获取存储在SDCARD上的图像的URI.

当我想获得存储在drawable上的图像的Uri时,我使用它并且它完美地工作:

i.putExtra(Intent.EXTRA_STREAM, Uri.parse("android.resource://" + getPackageName() + "/" + R.drawable.image));
Run Code Online (Sandbox Code Playgroud)

但是,如果我想获得存储在SDCARD上的图像的URI,我尝试使用它,它不起作用,出了点问题:

i.putExtra(Intent.EXTRA_STREAM, Uri.parse("/mnt/sdcard/car.jpg"));
Run Code Online (Sandbox Code Playgroud)

请问有人能告诉我如何获得存储在SD卡上的正确图像吗?

谢谢

android uri android-sdcard

10
推荐指数
2
解决办法
3万
查看次数

Android:当SD卡作为磁盘驱动器安装到计算机时检测到

我正在编写一个应用程序,需要检测SD卡何时作为磁盘驱动器通过USB安装到计算机或手动删除时.为此尝试使用广播接收器,但onReceive没有被调用.我的代码如下.

IntentFilter filter2 = new IntentFilter();
        //filter2.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        filter2.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
        filter2.addAction(Intent.ACTION_MEDIA_SHARED);
        filter2.addAction(Intent.ACTION_MEDIA_REMOVED);
        filter2.addAction(Intent.ACTION_MEDIA_MOUNTED);

        registerReceiver(new CustomBroadcastReceiver(), filter2);
Run Code Online (Sandbox Code Playgroud)

我的广播接收器如下......

public class CustomBroadcastReceiver extends BroadcastReceiver{

    public CustomBroadcastReceiver(){

    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if(action.equals(Intent.ACTION_MEDIA_UNMOUNTED) || action.equals(Intent.ACTION_MEDIA_SHARED) || action.equals(Intent.ACTION_MEDIA_REMOVED)){
            HardwareManager.IS_MEDIA_MOUNTED = false;
        }else if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){
            HardwareManager.IS_MEDIA_MOUNTED = true;
        }else if(action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){
            HardwareManager.IN_AIRPLANE_MODE = intent.getBooleanExtra("state", false);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

当我通过USB连接为磁盘驱动器时,onReceive方法不会触发.

我究竟做错了什么 ?

android broadcastreceiver android-sdcard

10
推荐指数
1
解决办法
8103
查看次数

SAF(存储访问框架)是否解决了Android 4.4(KitKat)中的SD卡WRITE问题?

在Android 4.4中,来自Play商店的应用程序只能写入其应用程序特定目录(例如:/storage/extSdCar/Android/data/com.example.myapp/),并且不允许应用程序在micro SD卡中写入此目录以外的内容.所以我正在探索新的SAF API来检查我是否可以使用SAF写入除应用程序特定目录之外的micro SD卡.

我已经通过创建示例提供程序和客户端应用程序来实现SAF.在我的提供商中,我尝试通过在queryRoots中实现以下代码来显示SD卡的全部内容:

    row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(new File("/storage/extSdCard")));
    row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_RECENTS | Root.FLAG_SUPPORTS_SEARCH);
Run Code Online (Sandbox Code Playgroud)

我在我的客户端创建了以下意图,我可以通过我的提供商从SAF的系统UI浏览SD卡的全部内容.

    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("*/*");
    intent.putExtra(Intent.EXTRA_TITLE, "test.txt");
    startActivityForResult(intent, WRITE_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

当我单击保存按钮时,我收到Toast错误"无法保存文档".但是当我导航到我的提供者的App特定目录(/storage/extSdCar/Android/data/com.example.myprovider/)时系统UI,我能够保存文档.也没有意图,如Intent.CATEGORY_WRITABLE,所以我只能获得可以编辑的文档.请帮我解决以下几点:

似乎即使我们使用SAF,仍然对micro SD卡的WRITE限制保持不变.它是否正确?

2.有什么方法可以创建或删除或修改micro SD卡中我的App特定目录之外的已有文件?

3.谁为普通用户文件决定FLAG_SUPPORTS_WRITE标志,如照片,视频,音乐,文档等?

java android android-sdcard android-4.4-kitkat storage-access-framework

10
推荐指数
1
解决办法
7116
查看次数

如何通过为Lollipop提供的API随机访问SD卡上的文件?

我的应用程序使用Java类RandomAccessFile通过SeekableByteChannel接口的实现随机读取/写入SD卡上的文件.现在我需要使用新的Lollipop API为Android 5.0重写它.

我找到了唯一的阅读方式:

InputStream inputStream = getContentResolver().openInputStream(uri);
Run Code Online (Sandbox Code Playgroud)

和写:

ParcelFileDescriptor pfd = getActivity().getContentResolver().openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
Run Code Online (Sandbox Code Playgroud)

从/到新API中的文件.

我希望能够在某个随机位置设置通道,并将字节读/写到该位置.是否可以在新的SDK 21中执行此操作?新的SDK是否意味着获取频道:

FieInputChannel fieInputChannel = fileInputStream.getChannel();
FieOutputChannel fieOutputChannel = fileOutputStream.getChannel();
Run Code Online (Sandbox Code Playgroud)

或其他一些方法?

filechannel android-sdcard randomaccessfile android-5.0-lollipop documentfile

10
推荐指数
1
解决办法
1678
查看次数