从活动内部将声音设置为铃声/通知时,我有时会遇到问题:
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, source);
values.put(MediaStore.MediaColumns.TITLE, "abc");
values.put(MediaStore.MediaColumns.SIZE, new File(source).length());
values.put(MediaStore.MediaColumns.MIME_TYPE, mime);
values.put(MediaStore.Audio.Media.ARTIST, "xyz");
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
final Uri curi = MediaStore.Audio.Media.getContentUriForPath(source);
Uri uri = getContentResolver().insert(curi, values);
Run Code Online (Sandbox Code Playgroud)
大多数时间uri类似于"content:// media/external/audio/media/23",但有时它是null.我不知道问题所在,音频文件还可以(它们播放正常)显然插入方法不会抛出任何异常.我查看了文档,但没有关于返回null的方法.可能是什么问题呢?
我想在多个应用程序之间共享数据,而不是使用ContentResolver-> ContentProvider机制,我可以定义一个客户端库,它与正在执行SQLite DB操作的进程对话?
ContentProvider带来了什么,通过让Process公开数据我们无法实现?
我正在实现一个PRIVATE ContentProvider,它有几个关系表(一对多,多对多).在我当前的实现中,所有表都可以通过URI访问.如何简化界面,以便URI不必访问内部的"通过"表?
例如,我有一个POSTS表,每个POST通过TAGGINGS表有很多TAGS.我想只与POSTS URI进行交互,并在内部进行"私有"工作ContentProvider.
为了query简单地返回带有连接表的游标,但我该怎么做insert呢?是bulkInsert我应该到什么?
android android-contentresolver android-contentprovider android-sqlite
在我的 android 应用程序中,我想将文件raw夹中的音频文件设置为铃声。为此,我写了下面的代码,但它不起作用。
请帮我解决这个问题。谢谢你。
代码 :
String name =best_song_ever.mp3;
File newSoundFile = new File("/sdcard/media/ringtone",
"myringtone.mp3");
Uri mUri = Uri.parse("android.resource://"
+ context.getPackageName() + "/raw/" + name);
ContentResolver mCr = context.getContentResolver();
AssetFileDescriptor soundFile;
try {
soundFile = mCr.openAssetFileDescriptor(mUri, "r");
} catch (FileNotFoundException e) {
soundFile = null;
}
try {
byte[] readData = new byte[1024];
FileInputStream fis = soundFile.createInputStream();
FileOutputStream fos = new FileOutputStream(newSoundFile);
int i = fis.read(readData);
while (i != -1) {
fos.write(readData, 0, i);
i = fis.read(readData);
} …Run Code Online (Sandbox Code Playgroud) android mediastore android-contentresolver android-contentprovider android-mediaplayer
代码:
首先是我的Uris
public static final String PACKAGE = "my.url.contentprovider";
public static final String TABLE_NAME = "NetworkTransaction";
public static final String AUTHORITY = PACKAGE + ".NetTransContentProvider";
public static final Uri BASE_URI = Uri.parse("content://"+AUTHORITY);
public static final Uri CONTENT_URI_ANY_OBSERVER = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/*");
public static final Uri CONTENT_URI_FIND_BY_ID = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/FIND/ID");
public static final Uri CONTENT_URI_INSERT_OR_REPLACE_BY_ID = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/INSERT/REPLACE/ID");
public static final Uri CONTENT_URI_INSERT_BY_ID = Uri.withAppendedPath(BASE_URI,TABLE_NAME+"/INSERT/ID");
Run Code Online (Sandbox Code Playgroud)
和我的活动代码加载器:
@Override
protected void onResume() {
super.onResume();
getSupportLoaderManager().restartLoader(NET_TRANS_LOADER_ID,mBundle,this).forceLoad();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
Uri uri = …Run Code Online (Sandbox Code Playgroud) android android-contentresolver android-contentprovider android-loadermanager android-loader
是否可以将内容提供者设置为只读?我知道这个问题被问了几次,但根据所有问题(例如this),我必须编写自己的自定义写入权限。
<permission android:name="com.test.WRITE_DATABASE" android:protectionLevel="normal" />
<permission android:name="com.test.READ_DATABASE" android:protectionLevel="normal" />
//...
<provider
android:authorities="xxx"
android:name="xxx"
android:exported="true"
android:readPermission="com.test.READ_DATABASE"
android:writePermission="com.test.WRITE_DATABASE" />
Run Code Online (Sandbox Code Playgroud)
但是黑客可以反编译我的应用程序并查看清单文件,然后他可以轻松地编写自己的应用程序:
<uses-permission android:name="com.test.WRITE_DATABASE" />
Run Code Online (Sandbox Code Playgroud)
所以它几乎没用...我有几个应用程序可以在我的主应用程序中使用一个内容提供程序。只有此应用程序应具有写入权限 - 其他应用程序只能从此数据库读取。有什么想法如何解决这个问题吗?
security android android-contentresolver android-contentprovider
以下代码获取 aString并将内容保存到现有文件中Uri。这些代码在 Android API 29 之前运行良好。
public void saveFile(String text, Uri existingSourceUri)
{
try {
ContentResolver cr = getContentResolver();
OutputStream os = cr.openOutputStream(existingSourceUri);
os.write(text.getBytes());
os.flush();
os.close();
} catch (Exception e) {
//show error message
}
}
Run Code Online (Sandbox Code Playgroud)
对于 Android API 29+,行为不稳定。例如,如果第一次使用 some 调用该函数text,则该文件将被正确保存。但是,如果第二次text为空,则不会保存文件。
有什么帮助吗?
我想知道在查询ContentProvider时,Android的ContentResolver是否支持在列上使用SQL函数.比如SQLite3的日期函数,要获取特定的日期格式,还是dateiff?
你怎么知道的?
我已阅读有关Android ContentResolver的文档
我也搜索了一个合适的例子无济于事.
根据文档,call当标准内容提供程序方法不足时,有一种方法可用作访问自定义提供程序方法的方法:
final Bundle call(Uri uri, String method, String arg, Bundle extras)
Call a provider-defined method.
Run Code Online (Sandbox Code Playgroud)
所以在我的代码中我执行:
getContentResolver().call(uri, method, arg, extras);
Run Code Online (Sandbox Code Playgroud)
但它总是返回 null 捆绑.实际上,提供程序中的方法永远不会被调用.
进一步的研究指出合同的(感知的)差异,其中RESOLVER具有uri参数而没有等效的PROVIDER参数:
Bundle call(String method, String arg, Bundle extras)
Call a provider-defined method.
Run Code Online (Sandbox Code Playgroud)
我显然不理解某事.谁能指出我正确的方向?
如何MediaStore.Images.Media.EXTERNAL_CONTENT_URI在两个日期之间查询内容解析器()?我正在尝试使用代码,但这不起作用.
Calendar c = Calendar.getInstance()
Date date2 = c.getTime();
c.add(Calendar.YEAR,-1);
Date date1 = c.getTime();
Cursor cursor = getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
MediaStore.MediaColumns.DATE_ADDED + ">=? and "+MediaStore.MediaColumns.DATE_ADDED +"<=?",
new String[]{"" + date1,""+date2},
MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");
Run Code Online (Sandbox Code Playgroud)