我们刚刚违反了适用于在Android 4.4上将文件写入SD卡(外部存储)的新权限(EACCES权限被拒绝)
在KitKat之前,我们设置了可写文件夹,如下所示:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/appfiles";
Run Code Online (Sandbox Code Playgroud)
然而,经过几个小时的搜索,我得出结论,无论是对还是错,在4.4设备上启用文件写入需要将其更改为:
mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/com.xyz.abc/appfiles";
Run Code Online (Sandbox Code Playgroud)
所以mfolder会是这样的:/mnt/sdcard/Android/data/com.xyz.abc/appfiles
这是正确的,我们是否在sdcard上创建了一个像上面那样的文件夹来启用4.4设备来写文件?
mfolder是我们保存为共享首选项的String.
然后,如果API> = 19,我们将运行此代码,该代码将更改mfolder String,然后将旧文件夹中的所有文件复制到新的"kitkat"文件夹.
if (android.os.Build.VERSION.SDK_INT>=19){
if (!mfolder.contains("/Android/data/com.xyz.abc/appfiles")){
if (prefs.getBoolean("kitkatcheck", false)==false){
//update mfolder from
// /mnt/sdcard/appfiles
// to
// /mnt/sdcard/Android/data/com.xyz.abc/appfiles
String prekitkatfolder = mfolder;
String kitkatfolder = mfolder.replace("/appfiles", "/Android/data/com.xyz.abc/appfiles");
mfolder = kitkatfolder;
try {
File sd = new File(mfolder);
if(!sd.exists() || !sd.isDirectory()) {
sd.mkdirs();
}
} catch (Exception e) {
Toast.makeText(getBaseContext(), "Error creating Kitkat folder!\n" + e.toString(), Toast.LENGTH_LONG).show();
return;
}
prefEditor.putString("patternfolder", mfolder);
prefEditor.putBoolean("kitkatcheck", …Run Code Online (Sandbox Code Playgroud) 我希望操纵ListView中所选行的背景颜色,从阅读中我需要使用CustomAdapter进行扩展.我的主适配器是SimpleCursorAdapter类型,所以我修改了一个将ArrayAdapter扩展为SimpleCursorAdapter的CustomAdapter.
我的问题是使用CustomAdapter时listview是空白但如果不扩展并使用SimpleCursorAdapter,listview有行/项.Logcat在我的CustomAdapter中显示一个问题,见下文.
这是我的主要活动代码:
phrasesdb helper = new phrasesdb(this);
database = helper.getWritableDatabase();
data = database.query("phrases", fields, null, null, null, null, fields[0] + " COLLATE NOCASE ASC");
//WORKING SimpleCursorAdapter
//dataSource = new SimpleCursorAdapter(this, R.layout.phrases, data, fields, new int[] { R.id.phrase });
//NOT WORKING
dataSource = new CustomAdapter(this, R.layout.phrases, data, fields, new int[] { R.id.phrase });
view = getListView();
setListAdapter(dataSource);
Run Code Online (Sandbox Code Playgroud)
这是Custom Adapter类,我已经标记了logcat错误的位置:
import android.content.Context;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
public class CustomAdapter extends SimpleCursorAdapter {
protected …Run Code Online (Sandbox Code Playgroud) 我有许多项目具有相同的活动,其中包括相同的可绘制资源。在每个项目中,我都复制了src java文件,布局xml文件和可绘制图像。理想情况下,我希望能够拥有其中的一组,并以某种方式与其他项目共享。共享文件夹似乎是一种解决方法,但是在设置共享文件夹后,我无法确定如何引用链接的文件。
为了简单起见,我有两个项目,一个Source项目,其中包含Java代码文件,布局文件,以及一个drawable文件夹,其中包含我需要的所有图像。第二个项目将其称为“目标”。
在“目标”中,我创建一个名为“链接”的链接文件夹到Source中的可绘制文件夹,然后可在资源管理器中查看它。在我的xml布局中,如何引用“链接的”文件夹,然后引用单个图像作为imageviews的SRC?
也可以用相同的方式链接我相同的活动java源文件和xml文件吗?
如果有另一种或更好的方法可以实现这一点,我将不胜感激。
谢谢
我知道对于Android 4.4,您可以使用此方法在外部存储中创建"特定于应用程序"文件夹.
getExternalFilesDir("myfiles").getAbsolutePath();
Run Code Online (Sandbox Code Playgroud)
这会创建文件夹/storage/sdcard/Android/data/com.abc.zyz/files/myfiles
但是,如果没有额外的文件夹"文件",以这种方式(我的首选)创建它是否安全?
String mfolder = Environment.getExternalStorageDirectory().getPath() + "/Android/data/" + getPackageName() + "/myfiles";
File sd = new File(mfolder);
if(!sd.exists() || !sd.isDirectory()) {
sd.mkdirs();
}
Run Code Online (Sandbox Code Playgroud)
我在API19模拟器上运行它,并且使用这两种方法创建文件夹,但我担心在真实设备上完成时可能存在使用第二个首选方法执行权限的权限问题.
有人可以建议或测试Kitkat设备吗?
我正在尝试将一些JavaScript代码转换为Java,但我不知道%两个数字变量之间的字符是什么:
testvalue = somevalue%anothervalue;
Run Code Online (Sandbox Code Playgroud)
这意味着什么或Java中的相同陈述是什么?
我在JavaScript中也有这个:
if(somevalue%2 == 1){
}
Run Code Online (Sandbox Code Playgroud)
%2这里的意思是什么?
我有2个字符串,每个字符串包含25个字符.例如
X = "0000111111110111111111110"
Y = "0000011111000000000000000"
Run Code Online (Sandbox Code Playgroud)
如果每个具有"1"字符串Y的位置在字符串X中也具有"1",那么识别最有效的方法是真还是假?在这个例子中它应该返回True,因为X中有1个匹配Y中所有1的位置.
我可以阅读每个角色的位置并对所有25个进行比较,但希望有些聪明的人会知道更优雅的方式.