在我的应用程序中,我需要在设备存储中存储大量图像.这些文件往往满足设备存储,我想让用户能够选择外部SD卡作为目标文件夹.
我到处读到Android不允许用户写入外部SD卡,SD卡是指外部和可安装的SD卡而不是外部存储器,但文件管理器应用程序设法在所有Android版本上写入外部SD.
在不同的API级别(Pre-KitKat,KitKat,Lollipop +)上授予对外部SD卡的读/写访问权限的更好方法是什么?
更新1
我从Doomknight的答案中尝试了方法1,但没有结果:正如您所看到的那样,我在尝试在SD上写入之前在运行时检查权限:
HashSet<String> extDirs = getStorageDirectories();
for(String dir: extDirs) {
Log.e("SD",dir);
File f = new File(new File(dir),"TEST.TXT");
try {
if(ActivityCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED) {
f.createNewFile();
}
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
但是我在两个不同的设备上尝试了访问错误:HTC10和Shield K1.
10-22 14:52:57.329 30280-30280/? E/SD: /mnt/media_rw/F38E-14F8
10-22 14:52:57.329 30280-30280/? W/System.err: java.io.IOException: open failed: EACCES (Permission denied)
10-22 14:52:57.329 30280-30280/? W/System.err: at java.io.File.createNewFile(File.java:939)
10-22 14:52:57.329 30280-30280/? W/System.err: at com.myapp.activities.TestActivity.onResume(TestActivity.java:167)
10-22 14:52:57.329 30280-30280/? W/System.err: at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1326)
10-22 14:52:57.330 30280-30280/? W/System.err: at android.app.Activity.performResume(Activity.java:6338)
10-22 14:52:57.330 …Run Code Online (Sandbox Code Playgroud) 在Volley库中,NetworkImageView类需要ImageLoader 通过在ImageCache 实现中搜索所有图像请求来处理所有图像请求,用户可以自由选择缓存应该如何工作,图像的位置和名称.
我正在切换Volley 到Retrofit,我决定尝试的图像Picasso.
使用前一个库,我在包含图像URL的每个项目中都有一个String参数,然后我使用myNetworkImageView.setImageUrl(item.getURL())它,它能够确定图像是否缓存在磁盘上.如果图像存在于缓存文件夹中,则加载图像,否则下载并加载图像.
我希望能够对Picasso做同样的事情,是否可以使用PicassoAPI或我应该自己编写这样的功能?
我想将图像下载到文件夹(缓存文件夹),并Picasso.with(mContext).load(File downloadedimage)在完成时使用.这是正确的方法还是有任何最佳做法?
我在scikit-learn 封装中使用截断的SVD .
在SVD的定义中,原始矩阵阿被approxmated作为产品甲 ≈ UΣV*其中ù和V具有正交列,并且Σ是非负对角线.
我需要得到U,Σ和V*矩阵.
看一下这里的源代码,我发现调用后V*存储在self.components_字段中fit_transform.
是否有可能得到U 和Σ矩阵?
我的代码:
import sklearn.decomposition as skd
import numpy as np
matrix = np.random.random((20,20))
trsvd = skd.TruncatedSVD(n_components=15)
transformed = trsvd.fit_transform(matrix)
VT = trsvd.components_
Run Code Online (Sandbox Code Playgroud) 我有一个Android应用程序,当前正在使用Volley库来发出网络请求并显示下载的图像NetworkImageView.
我想测试其Retrofit功能,因为我需要运行大量请求(数千)我对并行执行有点担心.Volley处理并行请求,将RequestQueue并发运行请求限制为4,而其他请求则排队等待执行.在Retrofit文档中我没有找到任何方法来处理并发请求的数量,我怀疑这些细节留给了这个库中的开发人员.
它是否正确?如果是这样,是否有任何面向android的实现/库可用?否则,处理并行请求的最佳做法是什么?
我最初使用一个函数将一个char*作为UTF-8字符串返回给java,但由于我不断收到错误,我编写了以下函数来返回char*一个Java作为Java byte[],这样我就可以尝试将数组转换为一个String in java方面:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes(JNIEnv* env, jobject thiz, jint index) {
if(pDevs[index].device_name == NULL) return NULL;
int n=0;
while(pDevs[index].device_name){
n++;
} if (n==0) return NULL;
jbyteArray arr = (*env)->NewByteArray(env, n);
(*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name);
return arr;
}
Run Code Online (Sandbox Code Playgroud)
但是当我调用它时,我的应用程序崩溃了.我错过了什么吗?
更新:条件缺少++,这导致无限循环.但现在使用以下代码:
jbyteArray Java_com_vektor_amapper_util_InputDeviceManager_getDevNameBytes(JNIEnv* env, jobject thiz, jint index) {
int n=0;
if(pDevs[index].device_name == NULL) return NULL;
while(pDevs[index].device_name++){
n++;
} if(n==0) return NULL;
jbyteArray arr = (*env)->NewByteArray(env, n);
(*env)->SetByteArrayRegion(env,arr,0,n, (jbyte*)pDevs[index].device_name);
return arr;
}
Run Code Online (Sandbox Code Playgroud)
我得到了这个奇怪的JNI警告:
06-15 22:40:02.303:W/dalvikvm(7616):JNI警告:负jsize(NewByteArray)
怎么可能因为我只是增加价值n?
更新2: …
我正在尝试将HW视频加速添加到我的设备的cm10.2端口.我没有错误,但下面的那个,然后make停止工作,显然没有任何错误.
/home/vektor/CM102/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/../../../../arm-linux-androideabi/bin/ld: warning: shared library text segment is not shareable
/home/vektor/CM102/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin/../lib/gcc/arm-linux-androideabi/4.7/../../../../arm-linux-androideabi/bin/ld: error: treating warnings as errors
collect2: error: ld returned 1 exit status
make: *** [/home/vektor/CM102/out/target/product/s7300b/obj/SHARED_LIBRARIES/libamplayer_intermediates/LINKED/libamplayer.so] Error 1
make: *** Waiting for unfinished jobs....
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我应该使用限制较少的标志进行编译还是更糟糕的原因?
我正在使用Laravel 4开发一个简单的RESTful API.我设置了一个Route调用我的函数,Controller它基本上是这样做的:
我注意到CPU负载总共1700个请求,一次只有2个,一起提升到70-90%.
我是一个完整的PHP和laravel初学者,我已经按照本教程制作了API ,也许我可能做错了什么或者它只是缺乏优化的概念证明.我该如何改进这段代码?(启动函数是getGames)你认为所有问题的根源是Laravel还是我应该获得相同的结果甚至更改框架/使用原始PHP?
UPDATE1我还设置了文件Cache,但CPU负载仍然是~50%.
UPDATE2我将查询速率设置为每500毫秒两次,CPU负载降低12%,所以我猜这段代码缺少队列处理或类似的东西.
class GameController extends BaseController{
private static $platforms=array(
"Atari 2600",
"Commodore 64",
"Sega Dreamcast",
"Sega Game Gear",
"Nintendo Game Boy",
"Nintendo Game Boy Color",
"Nintendo Game Boy Advance",
"Atari Lynx",
"M.A.M.E.",
"Sega Mega Drive",
"Colecovision",
"Nintendo 64",
"Nintendo DS",
"Nintendo Entertainment System (NES)",
"Neo Geo Pocket",
"Turbografx 16",
"Sony PSP",
"Sony PlayStation",
"Sega Master System",
"Super Nintendo (SNES)",
"Nintendo Virtualboy",
"Wonderswan"); …Run Code Online (Sandbox Code Playgroud) 我试图将ant ANTLR3语法转换为ANTLR4语法,以便将它与antlr4-python2-runtime一起使用.该语法是C/C++模糊解析器.
在转换它(基本上删除树操作符和语义/语法谓词)之后,我使用以下方法生成了Python2文件:
java -jar antlr4.5-complete.jar -Dlanguage=Python2 CPPGrammar.g4
并且生成的代码没有任何错误,所以我在我的python项目中导入它(我使用PyCharm)进行一些测试:
import sys, time
from antlr4 import *
from parser.CPPGrammarLexer import CPPGrammarLexer
from parser.CPPGrammarParser import CPPGrammarParser
currenttimemillis = lambda: int(round(time.time() * 1000))
def is_string(object):
return isinstance(object,str)
def parsecommandstringline(argv):
if(2!=len(argv)):
raise IndexError("Invalid args size.")
if(is_string(argv[1])):
return True
else:
raise TypeError("Argument must be str type.")
def doparsing(argv):
if parsecommandstringline(argv):
print("Arguments: OK - {0}".format(argv[1]))
input = FileStream(argv[1])
lexer = CPPGrammarLexer(input)
stream = CommonTokenStream(lexer)
parser = CPPGrammarParser(stream)
print("*** Parser: START ***")
start = …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的应用程序实现某种轮选择器,因为当前的选项依赖于自定义Views或旧的ListView,所以我想基于我的解决方案RecyclerView.
我所做的到现在为止是在开始和结束时设定RecyclerView 2 View与不同类型,命名PADDING_TYPE 以使第一和最后一个项目的垂直居中RecyclerView.
recyclerView.post(new Runnable() {
@Override
public void run() {
//80dp is the height of a regular list item
int paddingHeight = ((recyclerView.getHeight()-SettingsManager.dptopixels(80))/2);
binding.getRoot().getLayoutParams().height = paddingHeight;
}
});
Run Code Online (Sandbox Code Playgroud)
现在我试图了解如何使所选项目保持垂直居中.
到目前为止我尝试了什么:
1- LinearSnapHelper
LinearSnapHelper helper = new LinearSnapHelper();
helper.attachToRecyclerView(mRecyclerView);
Run Code Online (Sandbox Code Playgroud)
没有按预期工作,我也尝试覆盖几种方法(可能是以错误的方式),但我无法使其自动垂直居中选择.并且它不够活泼,所选项目"移动"而不是被锁定到垂直中心.
2-自定义 RecyclerView.OnScrollListener
我尝试通过更改 此行来调整此处提出的代码,即用于水平滚动RecyclerView.OnScrollListener
allPixelsDate += dx;
Run Code Online (Sandbox Code Playgroud)
与垂直滚动差异:
allPixelsDate += dy;
Run Code Online (Sandbox Code Playgroud)
此实现接近工作,因为它选择最接近列表垂直中心的项目,但不将其锁定到中心.
是否有可能实现这样的结果?怎么样?
更清楚一点:我想在1:10 得到这里显示的结果.选择被"锁定"在中心.