2017-05-03 09:58:49 lfqsy 阅读数 429
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22492 人正在学习 去看看 姜雪伟
增加一个权限,变成系统APP
android:sharedUserId="android.uid.system”
2015-09-21 20:57:39 wu_cai_ 阅读数 1032
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22492 人正在学习 去看看 姜雪伟

android 读取sd卡中的图片  

一 读取sd卡中的图片
     1 获取读取sd的权限
        在AndroidMainfest.xml文件中添加
            <!-- 在SDCard中创建与删除文件权限 -->
 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></uses-permission>
 <!-- 往SDCard写入数据权限 -->
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>
 <uses-permission android:name="android.permission.RESTART_PACKAGES" ></uses-permission>
    注意:在<application...></application>前添加
     2 找到sd卡的目录(以真机的情况说明)
 
 /**
      *图片文件路径
 *打印Environment.getExternalStorageDirectory()得到:"/mnt/sdcard",即找到了sd卡的根目录
      */
 public String filePath=Environment.getExternalStorageDirectory()+"/client/tile/1_0_0.jpg";
   3 根据路径获取图片
          File mfile=new File(path);
     if (mfile.exists()) {//若该文件存在
     Bitmap bm = BitmapFactory.decodeFile(path);
     return bm;
     }
二 注意事项
    在读取sd卡中图片的过程中的一些可用判断
     1 Environment.getExternalStorageState()获取路径是否成功
       /*如获取成功,返回值为MEDIA_MOUNTED*/
       if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
    {


         String filePath=Environment.getExternalStorageDirectory().getPath();
    }
   2 获取sd卡的权限成功
     /*fileName=Environment.getExternalStorageDirectory()+"/client" 是个文件夹目录*/
     File f = new File(fileName);
     //可读
     if(f.canRead())
     Log.v("EagleTag","very bad");
     //可写
     if(f.canWrite())
          Log.v("EagleTag","very good");



 android WebView 控件加载本地sdcard中html文件图片的问题


烦恼了好几天的问题终于解决了
如果用
public void loadData(String data, String mimeType, String encoding)
则会出现html代码中图片路径不对导致不能正常显示图片(通常是一个白色的固定大小的框,或者没有)
 
当把路径改为绝对路径加上file://都还无法解决
 
终于,在网上查资料的时候发现了这个函数,正好解决这个问题
 
public void loadDataWithBaseURL(String baseUrl, String data, String mimeType,String encoding, String historyUrl)
baseUrl是图片的目录,在html代码中就写关于此目录的相对路径就可以了,哇嘎嘎!~
 
附带代码解释:
 
String htmlPath = "file:///mnt/sdcard/test/11.html";


String baseUrl = "file:///mnt/sdcard/test/";
 
webView.loadDataWithBaseURL(baseUrl, data, "text/html", "utf-8", null);
 
则两个调用都可以显示正常的html网页了,并且前一种可以对针对不同分辨率大小的屏幕做缩放了!!


Android中的Environment.getExternalStorageState使用




如果我们想要读取或者向SD卡写入,这时就必须先要判断一个SD卡的状态,否则有可能出错。
那么SD卡状态为什么时才能读取呢,经过我的各种情况的实践,大致如下:

SD状态
现象描述
/mnt/sdcard目录是否存在
canRead返回
canWrite返回
在/mnt/sdcard创建文件
在/mnt/sdcard创建文件夹
MEDIA_MOUNTED
SD卡正常挂载
TRUE
TRUE
TRUE
TRUE
TRUE
MEDIA_REMOVED
无介质
TRUE
FALSE
FALSE
false:  原因Permission denied
FALSE
MEDIA_UNMOUNTED
有介质,未挂载,在系统中删除
TRUE
FALSE
FALSE
false:  原因Permission denied
FALSE
MEDIA_BAD_REMOVAL
介质在挂载前被移除,直接取出SD卡
TRUE
FALSE
FALSE
false:  原因Permission denied
FALSE
MEDIA_CHECKING
正在磁盘检查,刚装上SD卡时
TRUE
FALSE
FALSE
false:  原因Permission denied
FALSE
MEDIA_SHARED
SD卡存在但没有挂载,并且通过USB大容量存储共享,操作打开USB存储
TRUE
FALSE
FALSE
false:  原因Permission denied
FALSE
MEDIA_MOUNTED_READ_ONLY
sd卡存在并且已挂载,但是挂载方式为只读
-
-
无法模拟,SD卡不允许修改权限
MEDIA_NOFS
介质存在但是为空白或用在不支持的文件系统
-
-
无法模拟,SD卡格式化后再加载会自动生成系统文件
MEDIA_UNMOUNTABLE
存在SD卡但是不能挂载,例如发生在介质损坏
-
-
无法模拟


通过上表可以看出,只有在SD卡状态为MEDIA_MOUNTED时/mnt/sdcard目录才是可读可写,并且可以创建目录及文件。
所以我们读取SD卡时一般会这么写:
 
01
02
03
04
05
06
String state;
String path;
state = Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
path = Environment.getExternalStorageDirectory().getAbsolutePath();


读写SD卡记得加这两个权限:

?

 

01

02

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

1 在AndroidManifest文件中加入sdcard操作权限
  * <!--在SDCard中创建与删除文件权限 -->
  * <uses-permissioandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 
  * <!--往SDCard写入数据权限 --> 
  * <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
* 2 确认sdcard的存在
  * android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
* 3 获取扩展存储设备的文件目录
  * android.os.Environment.getExternalStorageDirectory();



2014-07-14 15:58:40 zjx2014430 阅读数 370
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22492 人正在学习 去看看 姜雪伟

在Android中,要模拟SD卡,要首先使用adb的mksdcard命令来建立SD卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题.

    但是在应用程序执行起来以后,我们可以看到sdcard的执行权限很有问题.懂Linux的人都知道,这样的权限是无法在SD开中写入内容的,也就无法建立目录.Android中对sd卡的读写权限问题

    但是,我们在adb shell命令中,依然可以在sdcard中建立目录,写入文件.这倒是也是见鬼的事情.但是,如果你想把权限更改成777,命令行并不报错,再使用ls -l查看一下,权限依然没有改变过来.我们急中生智,使用su命令将自己变成root用户,在使用chmod 777 sdcard来改变权限,发现结果依然无效.

    网上多有介绍,在Android的manifest.xml文档中加入下面的声名:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>



    试验之后,大多数人发现依然无效.没有人再把问题叙述得更详细些,不知道是什么样的心态?我的一个弟兄终于找到了问题所在.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="byd.eagle"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".EagleBackup"
                  android:label="@string/app_name">
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="8" />
</manifest>

    注意一下uses-permission在manifest.xml中的位置,这是解决问题的关键。

    那么我们再来写个试验程序:

    public class TestMakePath extends Activity {
      
       @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        try
        {
             Log.v("EagleTag",".......hahhha");
             Log.v("EagleTag",Environment.getExternalStorageState());
             File tPath=new File("/mnt/sdcard/tmp1");
             if(tPath.canRead())
                 Log.v("EagleTag","very bad");
             if(tPath.canWrite())
                 Log.v("EagleTag","very good");
             File tPathSon=new File("/mnt/sdcard/tmp1/good");
         
           tPathSon.mkdirs();
         }
         catch(Exception e)
         {
             Log.v("EagleTag","file create error");
         }      
      }
   }
   这回真的没问题了.
2015-01-21 14:59:01 vaecer 阅读数 1527
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22492 人正在学习 去看看 姜雪伟

一、获取读取SD卡的权限

复制代码
<!--在SDCard中创建与删除文件权限  -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--  从SDCard读取数据权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
复制代码

二、找到SD卡的目录

/**
     * Environment.getExternalStorageDirectory()得到:“、mnt/sdcard” 即找到了sd卡的根目录
     */
    private String path=Environment.getExternalStorageDirectory()+"client/tile/1.jpg";

三、根据路径获取图片

File mFile=new File(path);
        //若该文件存在
        if (mFile.exists()) {
            Bitmap bitmap=BitmapFactory.decodeFile(path);
            return bitmap;
        }

注意:

在读取sd卡中图片的过程中的一些可用判断

1、获取路径是否成功

复制代码
/**
         * Environment.getExternalStorageState()获取路径是否成功
         */
        
         if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            String path=Environment.getExternalStorageDirectory().getPath();
        }
复制代码

2、获取SD卡权限成功

复制代码
private String path=Environment.getExternalStorageDirectory()+"client";
    File file=new File(path);
if (file.canRead()) {
            Log.v("TAG", "可读");
        }
        if (file.canWrite()) {
            Log.v("TAG", "可写");
        }
复制代码

 


2017-07-02 22:15:56 wjb820728252 阅读数 4295
  • Unity3D移动端实战经验分享

    主要是围绕资源加载效率的优化,文本文件加载,比如xml序列化读取,protobuf文件序列化,以及消息事件封装及应用,shader的优化及运用,移动端实时阴影的绘制。

    22492 人正在学习 去看看 姜雪伟

对Android的SD卡进行读取权限设置时:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

结果报错:
这里写图片描述

依然提示我没有权限,于是百度说是版本问题,23.0版本(笔者的版本是25.0)以上的不仅仅要设置上面的权限,还要在对SD卡有读写操作的地方授权,下面是公共类:

public class PermisionUtils {

    // Storage Permissions
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE};

    /**
     * Checks if the app has permission to write to device storage
     * If the app does not has permission then the user will be prompted to
     * grant permissions
     *
     * @param activity
     */
    public static void verifyStoragePermissions(Activity activity) {
        // Check if we have write permission
        int permission = ActivityCompat.checkSelfPermission(activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE);
        }
    }
}

然后直接在需要授权的地方调用:

    //检测读写权限
    PermisionUtils.verifyStoragePermissions(this);

程序运行的时候,会询问是否授权

这里写图片描述

点击授权即可。

一定要在AndroidManifest.xml中加入这条语句

博文 来自: xiaoming1430026911
没有更多推荐了,返回首页