据我所知,我可以使用TCPListener和Socket创建一个服务器,那么它们之间的区别是什么?
插座
private Socket MainSock;
MainSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MainSock.Bind(new IPEndPoint(IPAddress.Any, port));
MainSock.Listen(500);
MainSock.BeginAccept(AcceptConnections, new Wrapper());
Run Code Online (Sandbox Code Playgroud)
的TCPListener
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(localAddr, port);
server.Start();
Run Code Online (Sandbox Code Playgroud)
我真的很困惑.他们俩听取了联系,那么它们之间的区别是什么?
更新的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.IO;
public class Wrapper
{
public byte[] buffer;
public SslStream sslStream;
public object connector;
}
public class Sock
{
private Dictionary<string, byte> Connections; …Run Code Online (Sandbox Code Playgroud) 我目前正在开发的应用程序需要对单个单词进行简单的语音识别.但是,我不想使用:
startActivityForResult()使用ACTION_RECOGNIZE_SPEECH
因为我需要在用户说话时显示其他内容.所以我尝试了这个:
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(context);
speechRecognizer.setRecognitionListener(this);
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE,"en");
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
speechRecognizer.startListening(intent);
Run Code Online (Sandbox Code Playgroud)
这应该使我能够得到结果,但我总是得到:
没有选定的语音识别服务
此代码也返回false:
boolean speechEnabled = SpeechRecognizer.isRecognitionAvailable(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)
所以我认为到目前为止仅仅使用SpeechRecognizerwith startListening对Android Wear不起作用...有关如何在不显示任何特定UI的情况下实现语音识别的任何建议?
编辑:我想这与谷歌语音搜索没有安装在设备上有关,但手动安装它不是真正的选择.
在我的应用程序中,我正在利用MediaSessionCompat媒体播放器服务播放音频.特别是,我想将当前歌曲的元数据广播到蓝牙设备(可以工作),并将锁定屏幕图像设置为当前歌曲的专辑封面.
与此问题类似:在Android中设置锁定屏幕背景(如Spotify do)
每次换歌,我先理清当前MediaMetadataCompat和PlaybackStateCompat从MediaSessionCompat像这样:
mSession.setActive(false);
mSession.setMetadata(null);
mSession.setPlaybackState(null);
Run Code Online (Sandbox Code Playgroud)
然后,我使用各自的构建器创建这些类的新实例
MediaMetadataCompat metadata = new MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_TITLE,
songName)
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST,
artistName)
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM,
albumName)
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, durationMs)
.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bitmap)
.build();
PlaybackStateCompat state = new PlaybackStateCompat.Builder()
.setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE | PlaybackStateCompat.ACTION_PAUSE |
PlaybackStateCompat.ACTION_SKIP_TO_NEXT | PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)
.setState(PlaybackStateCompat.STATE_PLAYING, positionMs, 1.0f, SystemClock.elapsedRealtime())
.build();
Run Code Online (Sandbox Code Playgroud)
然后我在上面设置新的元数据 MediaSessionCompat
mSession.setActive(true);
mSession.setMetadata(metadata);
mSession.setPlaybackState(state);
Run Code Online (Sandbox Code Playgroud)
在我的蓝牙设备上,元数据工作正常,并且每次歌曲更改时都会更改.然而,在我的手机上,锁屏专辑封面仅在第一次更新.我已经确认我设置的位图是新的,但图像不会改变.
我还在服务中创建媒体样式通知,以允许用户通过持久通知和锁定屏幕控制音乐.
NotificationCompat.MediaStyle style = new NotificationCompat.MediaStyle();
style.setShowActionsInCompactView(0, 1, 2, 3, 4);
Intent intent = new Intent(this, DestinationActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent …Run Code Online (Sandbox Code Playgroud) 我意识到这个问题基本上是无限次提出的,但是我一直没有找到适合我的情况的解决方案。
我正在使用Android Studio 1.5,在运行Android 4.2.2的LG-MS770上进行调试。
我测试过的其他设备均具有良好的功能(HTC One M8,Samsung Galaxy S5,Note 4,多个其他设备以及众多虚拟设备配置),但是这款手机产生的Logcat输出绝对为零。我的应用程序没有任何内容,设备上也没有任何其他进程正在运行。如果相关的话,Android Monitor中的其他度量(网络,内存,CPU,GPU)都可以正常输出。
我确保已通过USB启用调试。(我可以遍历断点,但Log.d("TAG","log")什么也没显示。
我还尝试了此问题的常规修复方法:重新启动logcat,确保正确设置了过滤器,运行adb kill-server&adb start-server,断开并重新连接设备,重新启动Android Studio和我的PC,但都无济于事。
有谁知道其他解决方案吗?或特定于此设备的东西?
谢谢!
编辑:
该设备已植根,并具有基于CyanogenMod 11 的自定义rom
adb logcat -d 打印以下内容:
reloc_library[1331]: 20370 cannot locate 'android_log_setColoredOutput'... CANNOT LINK EXECUTABLE
这与自定义ROM有关吗?
当我使用这段代码时:
process = Runtime.getRuntime().exec("su");
os = new DataOutputStream(process.getOutputStream());
Run Code Online (Sandbox Code Playgroud)
总有一个错误,任何想法?在Android虚拟设备上运行
W/System.err(3211): java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
W/System.err(3211): at java.lang.ProcessManager.exec(ProcessManager.java:211)
W/System.err(3211): at java.lang.Runtime.exec(Runtime.java:174)
W/System.err(3211): at java.lang.Runtime.exec(Runtime.java:247)
W/System.err(3211): at java.lang.Runtime.exec(Runtime.java:190)
W/System.err(3211): at com.example.executeandroidtest.ShellUtils.execCommand(MainActivity.java:661)
W/System.err(3211): at com.example.executeandroidtest.MainActivity$3.run(MainActivity.java:410)
W/System.err(3211): at java.lang.Thread.run(Thread.java:818)
W/System.err(3211): Caused by: java.io.IOException: Permission denied
W/System.err(3211): at java.lang.ProcessManager.exec(Native Method)
W/System.err(3211): at java.lang.ProcessManager.exec(ProcessManager.java:209)
W/System.err(3211): ... 6 more
Run Code Online (Sandbox Code Playgroud) 我一直试图在Eclipse中制作我的第一个Android应用程序(一个简单的温度转换器),但是当我点击手机上的按钮时,应用程序崩溃了.这是完整的Java代码
package com.example.myfirstapp;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
String number;
int number2;
int output;
boolean F;
public void onBtnClicked(View view){
EditText mEdit = (EditText)findViewById(R.id.editText1);
TextView myTextView = (TextView) findViewById(R.id.label);
number = mEdit.getText().toString();
number2 = Integer.parseInt(number);
if(F=true){
output=number2*9/5+32;
}
else{
output=number2-32*5/9;
}
myTextView.setText(output);
} …Run Code Online (Sandbox Code Playgroud)