精华内容
下载资源
问答
  • 安卓开发怎么读取微信小视频文件
  • 写一个软件,读取手机本地的短信内容,我这里实现的是读取所有短信中的第一条短信,也就是最新接收的消息。...布局文件中只有一个TextView控件用来显示短信内容用的,这里就不上代码了 package com.co...

     

      写一个软件,读取手机本地的短信内容,我这里实现的是读取所有短信中的第一条短信,也就是最新接收的消息。很多软件登录的时候要输入手机验证码,如果软件可以自动读取最新接收的短信验证码就会方便很多,这种功能的实现就是读取完短信后再通过正则取出其中的验证码。

     

    步骤:

    布局文件中只有一个TextView控件用来显示短信内容用的,这里就不上代码了

    package com.contentprovide.liuliu.test_9_12_02;
    
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        Cursor cursor;
    
        TextView te;
    
        String body;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            te = (TextView) findViewById(R.id.te);
    
            cursor = this.getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);
    
    //        把指针指向第一个
            if (cursor.moveToFirst()) {
    
                 body = cursor.getString(cursor.getColumnIndex("body"));
    
                te.setText(body);
    
            }
    
    

    } }

     

    转载于:https://www.cnblogs.com/lyd447113735/p/9635641.html

    展开全文
  • 我希望在Adapter文件中也可以读取主页面的数据   下面这张图是MainActivity中摄氏度转华氏度方法,在Adapter文件没法读取数据没法判断  <p><img alt="" height="168" src=...
  • 最近有个程序需要读取手机文件的内容,谢了一个专门读取的函数,返回读取出来的字符串,但是读不出来,代码如下“ public String getXml(String s) throws IOException{ String str = null; StringBuffer sb...
  • android6.0开发遇到Permission Denied问题,而xml文件中已经赋予了相应的读写权限 参考https://developer.android.com/training/displaying-bitmaps/load-bitmap.html 在运行时请求权限 PreviousNext ...

    android6.0开发遇到Permission Denied问题,而xml文件中已经赋予了相应的读写权限

    参考https://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    在运行时请求权限

    本课程所教授的内容:

    依赖关系和先决条件

    • Android 6.0(API 级别 23)

    另请阅读

    从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;例如,用户可以选择为相机应用提供相机访问权限,而不提供设备位置的访问权限。用户可以随时进入应用的“Settings”屏幕调用权限。

    系统权限分为两类:正常权限危险权限

    • 正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
    • 危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。

    如需了解详细信息,请参阅正常权限和危险权限

    在所有版本的 Android 中,您的应用都需要在其应用清单中同时声明它需要的正常权限和危险权限,如声明权限中所述。不过,该声明的影响因系统版本和应用的目标 SDK 级别的不同而有所差异:

    • 如果设备运行的是 Android 5.1 或更低版本,或者应用的目标 SDK 为 22 或更低:如果您在清单中列出了危险权限,则用户必须在安装应用时授予此权限;如果他们不授予此权限,系统根本不会安装应用。
    • 如果设备运行的是 Android 6.0 或更高版本,或者应用的目标 SDK 为 23 或更高:应用必须在清单中列出权限,并且它必须在运行时请求其需要的每项危险权限。用户可以授予或拒绝每项权限,且即使用户拒绝权限请求,应用仍可以继续运行有限的功能。

    :从 Android 6.0(API 级别 23)开始,用户可以随时从任意应用调用权限,即使应用面向较低的 API 级别也可以调用。无论您的应用面向哪个 API 级别,您都应对应用进行测试,以验证它在缺少需要的权限时行为是否正常。

    本课将介绍如何使用 Android 支持库来检查和请求权限。Android 框架从 Android 6.0(API 级别 23)开始提供类似方法。不过,使用支持库更简单,因为在调用方法前,您的应用不需要检查它在哪个版本的 Android 上运行。

    检查权限


    如果您的应用需要危险权限,则每次执行需要这一权限的操作时您都必须检查自己是否具有该权限。用户始终可以自由调用此权限,因此,即使应用昨天使用了相机,它不能假设自己今天仍具有该权限。

    要检查您是否具有某项权限,请调用 ContextCompat.checkSelfPermission() 方法。例如,以下代码段显示了如何检查 Activity 是否具有在日历中进行写入的权限:

    // Assume thisActivity is the current activity
    int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
            Manifest.permission.WRITE_CALENDAR);

    如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。如果应用不具有此权限,方法将返回PERMISSION_DENIED,且应用必须明确向用户要求权限。

    请求权限


    如果您的应用需要应用清单中列出的危险权限,那么,它必须要求用户授予该权限。Android 为您提供了多种权限请求方式。调用这些方法将显示一个标准的 Android 对话框,不过,您不能对它们进行自定义。

    解释应用需要权限的原因

    图 1. 提示用户授予或拒绝权限的系统对话框。

    在某些情况下,您可能需要帮助用户了解您的应用为什么需要某项权限。例如,如果用户启动一个摄影应用,用户对应用要求使用相机的权限可能不会感到吃惊,但用户可能无法理解为什么此应用想要访问用户的位置或联系人。在请求权限之前,不妨为用户提供一个解释。请记住,您不需要通过解释来说服用户;如果您提供太多解释,用户可能发现应用令人失望并将其移除。

    您可以采用的一个方法是仅在用户已拒绝某项权限请求时提供解释。如果用户继续尝试使用需要某项权限的功能,但继续拒绝权限请求,则可能表明用户不理解应用为什么需要此权限才能提供相关功能。对于这种情况,比较好的做法是显示解释。

    为了帮助查找用户可能需要解释的情形,Android 提供了一个实用程序方法,即shouldShowRequestPermissionRationale()。如果应用之前请求过此权限但用户拒绝了请求,此方法将返回true

    :如果用户在过去拒绝了权限请求,并在权限请求系统对话框中选择了 Don't ask again 选项,此方法将返回 false。如果设备规范禁止应用具有该权限,此方法也会返回 false

    请求您需要的权限

    如果应用尚无所需的权限,则应用必须调用一个 requestPermissions() 方法,以请求适当的权限。应用将传递其所需的权限,以及您指定用于识别此权限请求的整型请求代码。此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同请求代码传递到 requestPermissions()

    以下代码可以检查应用是否具备读取用户联系人的权限,并根据需要请求该权限:

    // Here, thisActivity is the current activity
    if (ContextCompat.checkSelfPermission(thisActivity,
                    Manifest.permission.READ_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {
    
        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                Manifest.permission.READ_CONTACTS)) {
    
            // Show an expanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
    
        } else {
    
            // No explanation needed, we can request the permission.
    
            ActivityCompat.requestPermissions(thisActivity,
                    new String[]{Manifest.permission.READ_CONTACTS},
                    MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    
            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request.
        }
    }

    :当您的应用调用 requestPermissions() 时,系统将向用户显示一个标准对话框。您的应用无法配置或更改此对话框。如果您需要为用户提供任何信息或解释,您应在调用 requestPermissions() 之前进行,如解释应用为什么需要权限中所述。

    处理权限请求响应

    当应用请求权限时,系统将向用户显示一个对话框。当用户响应时,系统将调用应用的 onRequestPermissionsResult() 方法,向其传递用户响应。您的应用必须替换该方法,以了解是否已获得相应权限。回调会将您传递的相同请求代码传递给 requestPermissions()。例如,如果应用请求READ_CONTACTS 访问权限,则它可能采用以下回调方法:

    @Override
    public void onRequestPermissionsResult(int requestCode,
            String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
    
                } else {
    
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }

    系统显示的对话框说明了您的应用需要访问的权限组;它不会列出具体权限。例如,如果您请求 READ_CONTACTS 权限,系统对话框只显示您的应用需要访问设备的联系人。用户只需要为每个权限组授予一次权限。如果您的应用请求该组中的任何其他权限(已在您的应用清单中列出),系统将自动授予应用这些权限。当您请求此权限时,系统会调用您的 onRequestPermissionsResult() 回调方法,并传递 PERMISSION_GRANTED,如果用户已通过系统对话框明确同意您的权限请求,系统将采用相同方式操作。

    :您的应用仍需要明确请求其需要的每项权限,即使用户已向应用授予该权限组中的其他权限。此外,权限分组在将来的 Android 版本中可能会发生变化。您的代码不应依赖特定权限属于或不属于相同组这种假设。

    例如,假设您在应用清单中列出了 READ_CONTACTS 和 WRITE_CONTACTS。如果您请求 READ_CONTACTS 且用户授予了此权限,那么,当您请求WRITE_CONTACTS 时,系统将立即授予您该权限,不会与用户交互。

    如果用户拒绝了某项权限请求,您的应用应采取适当的操作。例如,您的应用可能显示一个对话框,解释它为什么无法执行用户已经请求但需要该权限的操作。

    当系统要求用户授予权限时,用户可以选择指示系统不再要求提供该权限。这种情况下,无论应用在什么时候使用 requestPermissions() 再次要求该权限,系统都会立即拒绝此请求。系统会调用您的 onRequestPermissionsResult() 回调方法,并传递 PERMISSION_DENIED,如果用户再次明确拒绝了您的请求,系统将采用相同方式操作。这意味着当您调用 requestPermissions() 时,您不能假设已经发生与用户的任何直接交互。

    展开全文
  • 安卓开发文件工具类

    2020-06-06 08:16:26
    只需要一个开关就可以了,所以选择在应用内的存储空间中写入一个status.txt,内容写入0和1,本来是写死的代码,但是后来又在一个地方需要用到同样的功能,所以把它提出来单列了一个工具类,一个存储、一个读取。...

    文章来源于:https://www.deep-os.com/?id=61
    在这里插入图片描述
    今天在修复某个bug时,需要在应用内部存储,只需要一个开关就可以了,所以选择在应用内的存储空间中写入一个status.txt,内容写入0和1,本来是写死的代码,但是后来又在一个地方需要用到同样的功能,所以把它提出来单列了一个工具类,一个存储、一个读取。

    import android.content.Context;
    
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    
    /**
     * 应用内空间的文件工具类
     */
    public class MyFileUtils {
    
    
        /**
         * 写入文件方法
         *
         * @param context
         * @param fileName
         * @param i        三个参数
         *                 1.上下文
         *                 2.文件名称
         *                 3.内容
         */
        public static void saveFile(Context context, String fileName, String i) {
            FileOutputStream out = null;
            BufferedWriter writer = null;
            try {
                out = context.getApplicationContext().openFileOutput(fileName, Context.MODE_PRIVATE);
                writer = new BufferedWriter(new OutputStreamWriter(out, "utf-8"));
                writer.write(i);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (writer != null) {
                        writer.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
        /**
         * 读取文件方法
         *
         * @param context
         * @param fileName
         * @return 两个参数
         * 1.上下文
         * 2.文件名
         */
        public static String MyLoadFile(Context context, String fileName) {
            FileInputStream in = null;
            BufferedReader reader = null;
            StringBuilder content = new StringBuilder();
            try {
                in = context.getApplicationContext().openFileInput(fileName);
                reader = new BufferedReader(new InputStreamReader(in));
                String line = "";
                while ((line = reader.readLine()) != null) {
                    content.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return content.toString();
        }
    }
    

    文件名就是:MyFileUtil.java
    写入的时候需要传入三个参数、读取的时候传入两个参数。
    做一下笔记,以后再用到的话可以直接copy了。

    其他:
    由于我只是写入一个0或者1,所以之前我有试了直接append一个int 0或者1,一直出现乱码,当然我没有想过这方面的原因,所以各种查找安卓写入文件乱码、java写入文件乱码,当然结果也是没有找到,于是慢慢排查自己的代码,发现直接append了一个int型,于是我抱着试一试的态度写入了一个"1",字符串类型的,完美!!!所以,很多时候出现问题还是仔细看自己的代码吧。

    文章来源于:https://www.deep-os.com/?id=61,转载请注明出处。

    展开全文
  • 本文实例讲述了Android开发实现读取assets目录下db文件的方法。分享给大家供大家参考,具体如下:最近准备打算写一个关于天气预报的app,偶然的机会在一大神的博客上看到了一个获取天气的api,获取天气是通过城市的...

    本文实例讲述了Android开发实现读取assets目录下db文件的方法。分享给大家供大家参考,具体如下:

    最近准备打算写一个关于天气预报的app,偶然的机会在一大神的博客上看到了一个获取天气的api,获取天气是通过城市的cityID,项目中准备通过读取weather_city.db数据库来查询cityID,这篇文章写怎么读取assets目录下的db文件,其实方法也挺简单的就是把assets目录下的db文件复制一份到”/data/data/” + packName + “/”目录下而已。

    public class DBManager {

    private String DB_NAME = "weather_city.db";

    private Context mContext;

    public DBManager(Context mContext) {

    this.mContext = mContext;

    }

    //把assets目录下的db文件复制到dbpath下

    public SQLiteDatabase DBManager(String packName) {

    String dbPath = "/data/data/" + packName

    + "/databases/" + DB_NAME;

    if (!new File(dbPath).exists()) {

    try {

    FileOutputStream out = new FileOutputStream(dbPath);

    InputStream in = mContext.getAssets().open("weather_city.db");

    byte[] buffer = new byte[1024];

    int readBytes = 0;

    while ((readBytes = in.read(buffer)) != -1)

    out.write(buffer, 0, readBytes);

    in.close();

    out.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    return SQLiteDatabase.openOrCreateDatabase(dbPath, null);

    }

    //查询

    public City query(SQLiteDatabase sqliteDB, String[] columns, String selection, String[] selectionArgs) {

    City city = null;

    try {

    String table = "city";

    Cursor cursor = sqliteDB.query(table, columns, selection, selectionArgs, null, null, null);

    if (cursor.moveToFirst()) {

    String parentCity = cursor.getString(cursor

    .getColumnIndex("parent"));

    String phoneCode = cursor.getString(cursor.getColumnIndex("phone_code"));

    String name = cursor.getString(cursor.getColumnIndex("name"));

    String pinyin = cursor.getString(cursor.getColumnIndex("pinyin"));

    String cityID = cursor.getString(cursor.getColumnIndex("posID"));

    String areaCode = cursor.getString(cursor.getColumnIndex("area_code"));

    city = new City(parentCity, name, pinyin, phoneCode, cityID, areaCode);

    cursor.moveToNext();

    cursor.close();

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    return city;

    }

    }

    为了方便数据的使用,我们建一个City类,对应City表中的字段,如下:

    public class City {

    private String parentCity;

    private String childCity;

    private String pinyin;

    private String phoneCode;

    private String cityID;

    private String areaCode;

    public City(String parentCity, String childCity, String pinyin, String phoneCode, String cityID, String areaCode) {

    this.parentCity = parentCity;

    this.childCity = childCity;

    this.pinyin = pinyin;

    this.phoneCode = phoneCode;

    this.cityID = cityID;

    this.areaCode = areaCode;

    }

    public String getParentCity() {

    return parentCity;

    }

    public void setParentCity(String parentCity) {

    this.parentCity = parentCity;

    }

    public String getAreaCode() {

    return areaCode;

    }

    public void setAreaCode(String areaCode) {

    this.areaCode = areaCode;

    }

    public String getCityID() {

    return cityID;

    }

    public void setCityID(String cityID) {

    this.cityID = cityID;

    }

    public String getPhoneCode() {

    return phoneCode;

    }

    public void setPhoneCode(String phoneCode) {

    this.phoneCode = phoneCode;

    }

    public String getPinyin() {

    return pinyin;

    }

    public void setPinyin(String pinyin) {

    this.pinyin = pinyin;

    }

    public String getChildCity() {

    return childCity;

    }

    public void setChildCity(String childCity) {

    this.childCity = childCity;

    }

    }

    测试代码:

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    contentTextView = (TextView) findViewById(R.id.content);

    dbManager = new DBManager(this);

    sqLiteDatabase = dbManager.initDBManager(getPackageName());

    String[] columns = new String[]{"parent", "name", "posID", "pinyin", "phone_code", "area_code"};

    String selection = "parent=?" + "AND" + " name=?";

    String[] selectionArgs = new String[]{"北京", "丰台"};

    City city = dbManager.query(sqLiteDatabase, columns, selection, selectionArgs);

    contentTextView.setText("邮编:" + city.getAreaCode() + "拼音:" + city.getPinyin() + "电话区号" + city.getPhoneCode() + "cityID:" + city.getCityID());

    }

    ec4320feab1211db13a83dafda4c4627.png

    读取的数据与表中的数据一致

    65e1a3283de59c97a86cc671134c26f2.png

    希望本文所述对大家Android程序设计有所帮助。

    展开全文
  • 本文实例讲述了Android开发实现读取Assets下文件文件写入存储卡的方法。分享给大家供大家参考,具体如下:调用一个反编译的.so文件,查看起加密和解密情况,需要解析上万的数组,而so文件加密解密都是通过Byte来...
  • //这里写的是assets文件夹下html文件的名称,需要带上后面的后缀名,前面的路径是安卓系统自己规定的android_asset就是表示的在assets文件夹下的意思。 webView.getSettings().setLayoutAlgorithm(WebSettings....
  • //这里写的是assets文件夹下html文件的名称,需要带上后面的后缀名,前面的路径是安卓系统自己规定的android_asset就是表示的在assets文件夹下的意思。 webView.getSettings().setLayoutAlgorithm(WebSettings....
  • 安卓开发笔记(二十二):读取本地(内置)html文件并实现和Javascript交互 实际上我们通常是使用WebView控件对本地html进行读取,这样就可以体会类似web app和安卓原生混合开发的乐趣了。在读取...
  • 安卓开发-图像处理-图片的读取与保存 1.加载资源文件中的图片 在工程的 /drawable文件夹下黏贴一张图片(上面的图片) 1.1 使用 imageView.setImageResource( id ) 来读取资源文件中的图片 imageView....
  • 本文介绍从零开始进行安卓APP的开发,MaterialDesign的使用。记录学习过程,仅供新手参考。引入MaterialDesignMaterialDesign是谷歌发布的一套安卓界面元素模板。首先我们把它引入到项目里面。首先从项目列表中打开...
  • 开发音乐播放器时除了网络音乐我们很多时候需要读取本地的音频文件,并且把歌曲的名字、歌手、时间等内容显示出来,但是本地储存的格式是不规范的,所以我们在把音频文件从本地获取出来之后还需要进行格式的转换...
  • 什么是...其特点为简单、轻量,适合保存少量简单类型的数据,不适合保存大批量或复杂类型的数据.SharedPreferences的实质是xml格式存储数据的文件.基础样例1. 写入和读取数据activit...
  • <p><strong>注意不是读取资源,而是获得路径名 </strong></p> 比如:我要获得下面图片中 tessdata的路径,代码要怎么写。...本人才接触安卓开发,坑好多!  </p>
  • 安卓开发实例二:文件浏览器

    千次阅读 2015-11-18 20:47:05
    读取文件,显示到界面上;ListView添加菜单,处理文件操作。 扩展:自定义Activity标题栏,创建后台服务播放MP3文件。 代码: public class MainActivity extends Activity { public stat
  • 安卓读取PDF包含目录

    2013-04-16 14:44:21
    安卓设备上读取PDF文件和目录的开发包。
  • 开发中,有时候需要去读取文件,但是如果这个文件在压缩包里怎么办呢? 其实安卓也提供了对应的处理方法 今天就大概介绍一下 主要用到的是ZipFile这个类 具体代码如下 ZipFile zip = new ZipFile...
  • 开发音乐播放器时除了网络音乐我们很多时候需要读取本地的音频文件,并且把歌曲的名字、歌手、时间等内容显示出来,但是本地储存的格式是不规范的,所以我们在把音频文件从本地获取出来之后还需要进行格式的转换 ...
  • 学习目标 项目案例-File实现数据读取 实现读取写入的文件如图所示 Android提供了FileOutputStream)方法用于打开应用程序的文件夹下name文件对应的输出流 File实现数据读取简介 任务实施-File实现数据读取 实现步骤...
  • 项目开发过程中,策划们可能会配置很多的数据放在不同的Excel当中,如商城物品等,那么我们程序就需要通过读取Excel的内容,已供程序使用。 下面是读取的Excel表内容: 首先在Unity中导入以下dll文件: dll下载地址...
  • (2)openFileInput()方法用于打开应用程序中对应的输入流,用于从文件读取数据; (3)openFileOutput()方法用于打开应用程序中对应的输出流,将数据存储到指定的文件中; 示例:FileOutputStream
  • 这是我写的获取信息得方法 ``` public List<Mp3Info> getMp3Infos(String c){ Cursor cursor = null; ... if(c.equals("songs")){//songs list ...但是我SD卡中有2个音频文件,却只显示一条信息。
  • 本来是想直接在build文件里配置变量如何直接apply插件的时候就能使用的,发现不行 public class PluginImpl implements Plugin { void apply(Project project) { project.extensions.create('pluginExt', ...
  • 安卓开发,读取阅读SD卡里的TXT文件,设置里可以设置自动滚屏,字体大小的设置等等.
  • 安卓有用的文件操作

    2014-03-22 09:47:36
    很有用的安卓开发工具类,包括文件读取,缓存读取,图片缓存等资源
  • 安卓开发笔记一

    千次阅读 2013-07-30 21:05:04
    在应用程序安装时被安卓操作系统读取,  并将清单文件中所注册的组件在安卓系统中进行登记注册。 3.清单文件中的intent-filter标签是用来匹配(用户)意图的,匹配上就执行相应的action。  其中标识当前...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 185
精华内容 74
关键字:

安卓开发文件读取