安卓系统的 Settings 数据在手机系统中的位置

备份下此点,以后方便回顾。

-------------------------------------------------------------

旧版本Android,将settings数据存在数据库中,{system, secure, global} 对应的是 /data/data/com.android.providers.settings/databases/settings.db 的三个表

新版本使用xml文件存储,一般位于 /data/system/users/0目录下,该目录的settings_global.xml,settings_secure.xml和settings_system.xml三个xml文件就是SettingsProvider中的数据文件。

 

获取值

adb shell settings get system [key]

adb shell settings get global [key]

adb shell settings get secure [key]

设置值

adb shell settings put system [key] [value]

adb shell settings put global [key] [value]

adb shell settings put secure [key] [value]

转载于: https://www.cnblogs.com/genggeng/p/9397437.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用C语言在Android系统上播放默认铃声的示例代码: #include <stdio.h> #include <stdlib.h> #include <jni.h> #include <android/log.h> #include <android/native_activity.h> #include <android/native_window.h> #include <android/native_window_jni.h> #include <SLES/OpenSLES.h> #include <SLES/OpenSLES_Android.h> #define LOG_TAG "RingtonePlayer" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) //声明OpenSLES会话接口对象、音频播放器对象和回调接口 SLObjectItf engineObject; SLEngineItf engineEngine; SLObjectItf outputMixObject; SLObjectItf audioPlayerObject; SLPlayItf audioPlayerPlay; SLAndroidSimpleBufferQueueItf audioPlayerBufferQueue; //声明默认铃声ID和缓存大小 static const char defaultRingtoneUri[] = "content://settings/system/ringtone"; short buffer[4096]; //声明C函数,用于从Java代码调用 JNIEXPORT void JNICALL Java_com_example_ringtoneplayer_RingtonePlayer_playRingtone(JNIEnv* env, jobject thiz) { SLresult result; //初始化OpenSLES引擎 result = slCreateEngine(&engineObject, 0, NULL, 0, NULL, NULL); result = (*engineObject)->Realize(engineObject, SL_BOOLEAN_FALSE); result = (*engineObject)->GetInterface(engineObject, SL_IID_ENGINE, &engineEngine); //初始化混音器对象 result = (*engineEngine)->CreateOutputMix(engineEngine, &outputMixObject, 0, NULL, NULL); result = (*outputMixObject)->Realize(outputMixObject, SL_BOOLEAN_FALSE); //初始化音频播放器对象 SLDataLocator_AndroidSimpleBufferQueue loc_bufq = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 2 }; SLDataFormat_PCM format_pcm = { SL_DATAFORMAT_PCM, 1, SL_SAMPLINGRATE_44_1, SL_PCMSAMPLEFORMAT_FIXED_16, SL_PCMSAMPLEFORMAT_FIXED_16, SL_SPEAKER_FRONT_CENTER, SL_BYTEORDER_LITTLEENDIAN }; SLDataSource audioSrc = { &loc_bufq, &format_pcm }; SLDataLocator_OutputMix loc_outmix = { SL_DATALOCATOR_OUTPUTMIX, outputMixObject }; SLDataSink audioSnk = { &loc_outmix, NULL }; const SLInterfaceID ids[1] = { SL_IID_BUFFERQUEUE }; const SLboolean req[1] = { SL_BOOLEAN_TRUE }; result = (*engineEngine)->CreateAudioPlayer(engineEngine, &audioPlayerObject, &audioSrc, &audioSnk, 1, ids, req); result = (*audioPlayerObject)->Realize(audioPlayerObject, SL_BOOLEAN_FALSE); result = (*audioPlayerObject)->GetInterface(audioPlayerObject, SL_IID_PLAY, &audioPlayerPlay); result = (*audioPlayerObject)->GetInterface(audioPlayerObject, SL_IID_BUFFERQUEUE, &audioPlayerBufferQueue); //打开默认铃声文件 jclass contextClass = (*env)->FindClass(env, "android/content/Context"); jfieldID systemFieldID = (*env)->GetStaticFieldID(env, contextClass, "SYSTEM_SERVICE", "Ljava/lang/String;"); jstring stringObj = (*env)->NewStringUTF(env, "audio"); jobject audioManagerObj = (*env)->CallObjectMethod(env, thiz, (*env)->GetStaticMethodID(env, contextClass, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"), stringObj); jclass audioManagerClass = (*env)->GetObjectClass(env, audioManagerObj); jmethodID getRingtoneURIID = (*env)->GetMethodID(env, audioManagerClass, "getRingtoneUri", "(I)Landroid/net/Uri;"); jobject ringtoneURI = (*env)->CallObjectMethod(env, audioManagerObj, getRingtoneURIID, 1); jstring ringtoneUriString = (jstring)(*env)->CallObjectMethod(env, ringtoneURI, (*env)->GetMethodID(env, (*env)->FindClass(env, "android/net/Uri"), "toString", "()Ljava/lang/String;")); const char* ringtonePath = (*env)->GetStringUTFChars(env, ringtoneUriString, 0); //打开音频文件,并将缓存数据填充到音频播放器对象的缓存队列 FILE* file = fopen(ringtonePath, "rb"); if (file == NULL) { LOGE("Failed to open file"); return; } fseek(file, sizeof(short) * 44, SEEK_SET); while (1) { result = fread(buffer, sizeof(short), 4096 / sizeof(short), file); if (result < 1) { break; } result = (*audioPlayerBufferQueue)->Enqueue(audioPlayerBufferQueue, buffer, result * sizeof(short)); } //开始播放音频 result = (*audioPlayerPlay)->SetPlayState(audioPlayerPlay, SL_PLAYSTATE_PLAYING); result = (*audioPlayerBufferQueue)->RegisterCallback(audioPlayerBufferQueue, playerCallback, NULL); result = (*audioPlayerBufferQueue)->Enqueue(audioPlayerBufferQueue, buffer, 0); } //回调函数,用于处理缓存队列已被耗尽的情况 void playerCallback(SLAndroidSimpleBufferQueueItf queue, void* context) { }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值