我已经读过,有必要在运行时向用户询问API 23及更高版本的某些权限.例如:android.permission.ACCESS_FINE_LOCATION.如果API为23或更高,是否有必要(甚至可能)要求在运行时使用GCM /推送通知的运行时权限?
我已经尝试requestPermissions在运行时使用该方法,但是当我将它与任何GCM /推送通知相关的权限一起使用时,它似乎不起作用(没有任何反应).
为此,我在我的Manifest中拥有以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
Run Code Online (Sandbox Code Playgroud)
用户知道的唯一权限是ACCESS_FINE_LOCATION从Play商店下载应用程序的时间.用户不应该选择是否允许推送通知?
任何帮助将不胜感激.
android push-notification google-cloud-messaging android-permissions
我想从字符串中计算数学表达式.我已经读过,解决方法是使用eval().但是当我尝试运行以下代码时:
<?php
$ma ="2+10";
$p = eval($ma);
print $p;
?>
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
解析错误:语法错误,意外的$ end在C:\ xampp\htdocs\eclipseWorkspaceWebDev\MandatoryHandinSite\tester.php(4):eval()'代码在第1行
有人知道这个问题的解决方案.
像Big O符号"O(1)"可以描述以下代码:
O(1):
for (int i = 0; i < 10; i++) {
// do stuff
a[i] = INT;
}
O(n):
for (int i = 0; i < n; i++) {
// do stuff
a[i] = INT;
}
O(n^2):
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// do stuff
a[i][j] = INT;
}
}
Run Code Online (Sandbox Code Playgroud)
另一个问题:
我一直试图在我的应用程序中实现Firebase消息传递一段时间.我遵循了不同类型的教程,包括Firebase的官方教程,使用Firebase Assistant手动和自动添加.
出于某种原因,以下陈述是正确的:
MyFirebaseInstanceIDService:
class MyFirebaseInstanceIDService : FirebaseInstanceIdService() {
val TAG = javaClass?.simpleName
override fun onTokenRefresh() {
super.onTokenRefresh()
val refreshedToken = FirebaseInstanceId.getInstance().token
System.out.println("firebasedebug (" + TAG + "): onTokenRefresh(): " + refreshedToken)
}
}
Run Code Online (Sandbox Code Playgroud)
MyFirebaseMessagingService
class : FirebaseMessagingService() {
val TAG = javaClass?.simpleName
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
super.onMessageReceived(remoteMessage)
System.out.println("firebasedebug (" + TAG + "): onMessageReceived(remoteMessage: " + remoteMessage+")")
}
}
Run Code Online (Sandbox Code Playgroud)
我已将以下内容添加到我的清单中:
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
<service
android:name="dk.myapp.service.firebase.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
android:name="dk.myapp.service.firebase.MyFirebaseInstanceIDService"
android:exported="false">
<intent-filter> …Run Code Online (Sandbox Code Playgroud) 当我将最新版本的原生 Android 应用上传到 Play 商店时,它首先给了我以下警告:
警告:停用此 APK 将导致您的应用可在更少类型的设备上进行新安装
我还是决定上传它,因为支持的设备数量和以前一样。
我觉得这有点奇怪,因为我没有改变我的“minSdkVersion”。我只向 1% 的用户发布了这个版本,大约有 1500 名用户。
我实际上不知道我是否应该担心,但我已经通过 AppCenter 监控了活动,我们已将其集成到应用程序中。而且我认为新版本的用户数量低得令人怀疑。在 Play 商店中有 0 次崩溃(虽然这可能是一件好事)。
此外,Play Store 中的“原生平台”一栏从 5 变为 4。此时我在此栏中有以下内容:“arm64-v8a、armeabi-v7a、x86、x86_64”
不幸的是,我无法再看到有关此的旧信息,因为我随后发布了另一个版本(错误修复)。但我认为是这样的:
1 区分:armeabi + 4 常见:differarm64-v8a、armeabi-v7a、x86、x86_64
这与能够下载应用程序的用户数量有关吗?我应该担心吗?
我试图在java中找出关于哈希的东西.例如,如果我想在hashmap中存储一些数据,它是否会有一些带有hashvalues的底层哈希表?或者,如果有人可以对哈希的工作方式做出一个简单明了的解释,我会非常感激.
我已经为此苦苦挣扎了一段时间。我只是想做的是在我的 android 应用程序和我的 PC 上的 java 程序之间创建一个套接字连接。
我都尝试过 UDP 和 TCP 套接字以及不同类型的 IP 和端口号。
那么,我怎样才能做到这一点?
这是我的(当前代码)与(尝试的)TCP 连接:
服务端代码截图(PC java程序):
try {
DatagramSocket socket = new DatagramSocket(4466);
byte[] buffer = new byte[2048];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
以及来自我的 android 应用程序(客户端)的相关片段:
try {
InetAddress host = InetAddress.getByName("192.168.1.255");
DatagramSocket socket = new DatagramSocket (null);
byte[] buffer = new byte[2048];
buffer = "hej hej".getBytes();
DatagramPacket packet=new DatagramPacket (buffer, buffer.length, …Run Code Online (Sandbox Code Playgroud) 我在从Android应用程序向我的Web服务(Google Cloud和PHP)发出正确的POST请求时遇到了一些问题.
当我尝试从Android发送图片时,它会返回"200 OK"响应,但图片不会保存在Google云端存储上的存储桶中.我知道问题在于Android应用程序中我的方法发出的POST请求,因为我已经使用Postman进行了测试并且没有任何问题.所以我的应用程序的下面一段代码出了问题:
public void uploadFile(String uploadUrl, String filename, String newFileName) throws IOException {
FileInputStream fileInputStream = new FileInputStream(new File(filename));
URL url = new URL(uploadUrl);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs.
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Set HTTP method to POST.
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
outputStream = new DataOutputStream(connection.getOutputStream() );
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-Disposition: form-data; name=\"img\";filename=\"" + filename + "\"" + lineEnd);
outputStream.writeBytes(lineEnd);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = …Run Code Online (Sandbox Code Playgroud) 我已经尝试了很多不同的方法来自网络上的例子,但我似乎无法让这个工作.我正在尝试制作一种在画布上的两点之间绘制曲线的方法.曲线应由radius参数定义.
以下是我目前的代码.
public OverlayBuilder drawCurvedArrow(int startX, int startY, int endX, int endY, int curveRadius, int padding, int color) {
PointF mPoint1 = new PointF(startX, startY);
PointF mPoint2 = new PointF(endX, endY);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(12);
paint.setColor(color);
Path myPath = new Path();
myPath.moveTo(startX, startY);
myPath.quadTo(mPoint1.x, mPoint1.y, mPoint2.x, mPoint2.y);
canvas.drawPath(myPath, paint);
return this;
}
Run Code Online (Sandbox Code Playgroud)
问题是我无法弄清楚如何弯曲画布上绘制的线条.
我为listview创建了一个customadapter,但由于某种原因,getView方法的参数"position"始终为0,这使得该方法毫无用处.
这是我的customAdapter的代码,扩展了BaseAdapter:
public class CreateProgramAdapter extends BaseAdapter {
private LayoutInflater inflater;
private ArrayList<TrainingPass> trainingPasses;
private List<TrainingPass> items;
private Context context;
public CreateProgramAdapter(Context context, List<TrainingPass> items) {
this.context = context;
this.items = items;
this.inflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return items.size();
}
@Override
public TrainingPass getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
TrainingPassHolder holder;
if(convertView == null) { …Run Code Online (Sandbox Code Playgroud)