Android 使用Settings 数据库demo(源码)以及adb 读写settings数据库,ContentObserver侦听settings数据库里面某个key的value的变化。

         Android 使用Settings 数据库demo(附源码)

一、android系统很多设置的数据都保存在settings数据库里面,例如音量大小、休眠时间、屏幕亮度等。

二、adb查看和写settings数据库里面的值。

           2. 1 安全性的用户偏好系统设置,第三方APP有读没有写的权限

                   secure
                  Settings.Secure
                 content://settings/secure
           2. 2 所有的编号设置,对系统的所有用户公开,第三方APP有读没有写的权限
                   global
                   Settings.Global
                   content://settings/global
           3.3 包含各种各样的用户偏好系统设置
                   system
                   Settings.system
                   content://settings/system

三、实例学习,demo的功能一是向setting数据库某个key写value,然后读出来。功能二是侦听settings数据库里面某个key的value,如果改变会有提醒。

      3.1 settingdatebasedemo\app\src\main\java\com\example\settingdatebasedemo\MainActivity.java


package com.example.settingdatebasedemo;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import android.database.ContentObserver;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {
    private TextView tv_time;
    private int i=0;
    private static  String TAG="settingdatebasedemo";
    ChangeContentObserver mChangeContentObserver = null;
    ChangeSContentObserver mChangeSContentObserver = null;

   // 如果第三方应用是写不到Setting 数据库的,必须需要系统权限

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_time = (TextView) findViewById(R.id.itext);
        mChangeContentObserver = new ChangeContentObserver();
        mChangeSContentObserver= new ChangeSContentObserver();
 getContentResolver().registerContentObserver(Settings.Global.getUriFor("global_test"), true, mChangeContentObserver);
        getContentResolver().registerContentObserver(Settings.System.getUriFor("volume_ring_speaker"), true, mChangeSContentObserver);

    }      public void write_settings_database(View v)
      {
          i+=6;
          SetGlobalData(this.getApplicationContext(),"global_test", i);
          //getContentResolver().notifyChange(Settings.Global.getUriFor("haiyue"),null);
          //这个方法也是要在有上下文的地方执行,一般是在自定义的Provider中执行,第一个是url对象,第二个参数是null
          //getContext().getContentResolver().notifyChange(URI,null);
          //数据进行增删查成功后,都执行一下上面这个方法即可。
          tv_time.setText(String.valueOf(GetGlobalData(this.getApplicationContext(),"global_test")));
     }
    class ChangeSContentObserver extends ContentObserver {
        public ChangeSContentObserver (Handler handler) {
            super(handler);
        }
        public ChangeSContentObserver () {
            // TODO Auto-generated constructor stub
            super(new Handler());
        }
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            Toast.makeText(MainActivity.this,"i:volume_ring_speaker value has changed!", Toast.LENGTH_LONG).show();
            Log.d(TAG, "ChangeSContentObserver -->volume_ring_speaker value changed(" + selfChange + ") ");
        }
    }    /*
     * 监听值变化
     */
    class ChangeContentObserver extends ContentObserver {
        public ChangeContentObserver (Handler handler) {
            super(handler);
        }
        public ChangeContentObserver () {
            // TODO Auto-generated constructor stub
            super(new Handler());
        }
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            Toast.makeText(MainActivity.this,"i:global_test value has changed!", Toast.LENGTH_LONG).show();
            Log.d(TAG, "ChangeContentObserver --> onChange(" + selfChange + ") ");
        }
    }
    //Setting 数据库中写值   this.getApplicationContext()
    public static void SetGlobalData(Context cxt,String name,int value) {
        try {
            boolean rtv=false;
            Log.i(TAG,"SetGlobalData rtv="+rtv);
            rtv=Settings.Global.putInt(cxt.getContentResolver(), name, value);
            Log.i(TAG,"SetGlobalData rtv="+rtv);
        } catch (Exception e) {
            if (e != null) {
                Log.i(TAG, "setRecorderRear(Context," + value + ")> " + e.getMessage());
            }
        }
    }

    //Setting 数据库中读取值
    public static int GetGlobalData(Context cxt,String name) {//  Log.i("TAG",getdata() )
        try {
            return Settings.Global.getInt(cxt.getContentResolver(), name, -1);
        } catch (Exception e) {
            if (e != null) {
                Log.i(TAG, "getRecorderRear(Context)> " + e.getMessage());
            }
        }
        return 0;
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        getContentResolver().unregisterContentObserver(mChangeContentObserver);
    }
}

      3.2 android_studio_app\settingdatebasedemo\app\src\main\res\layout\activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/itext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
/>

    <Button
        android:id="@+id/ibutton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="write new value"
        android:onClick="write_settings_database"/>

</LinearLayout>

      3.3 settingdatebasedemo\app\src\main\AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.settingdatebasedemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="settingdatebasedemo"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:sharedUserId="android.uid.system"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission>
</manifest>

     注意添加 <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"></uses-permission>,不然会报error。

四、真机测试。

       4.1 因为写settings数据库需要系统级app,adb push到机子里面

adb push settingdatebasedemo\app\build\outputs\apk\debug\settingdatebasedemo.apk  /system/priv-app/

       4.2 demo app运行效果

五:Android Studio 源码下载路径:

settingdatebasedemo.zip_settings数据库android-桌面系统文档类资源-CSDN下载

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
使用adb pull命令从Android设备中提取数据库文件,您需要在命令行中执行以下步骤: 1. 首先,连接到您的Android设备并打开命令行终端。 2. 使用adb shell命令进入设备的shell环境。 3. 导航到数据库文件所在的目录。根据您提供的引用内容,在命令行中输入以下命令:cd /data/data/com.android.contacts/databases/ 4. 确保您在正确的目录中,可以使用ls命令来查看目录中的文件列表。根据您提供的引用内容,您可以在命令行中输入以下命令:ls 5. 一旦您确定了数据库文件的位置,您可以使用adb pull命令来提取数据库文件。在命令行中,输入以下命令:adb pull <数据库文件名> <本地目标路径> 请注意,<数据库文件名>应该是您想要提取的数据库文件的实际文件名,<本地目标路径>是您希望将数据库文件保存到的本地计算机上的目标路径。 综上所述,要使用adb pull命令从Android设备中提取数据库文件,您可以按照上述步骤进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Androidadb pull或push 拷贝手机文件到到电脑上,拷贝手机数据库到电脑上,拷贝电脑数据库到手机上](https://blog.csdn.net/weixin_39641103/article/details/111481364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值