android - APK 未安装在三星 Galaxy S8 上
问题描述
我刚刚使用 Android Studio 编写了一个 Android 应用程序。该应用程序编译没有错误,并且我还生成了签名的 APK,但如果我尝试将它安装在我的智能手机(三星 Galaxy S8)上,它会显示“应用程序未安装”。可能是什么问题?
这里有我的 Java 代码、我的 gradle、我的清单。
package com.unicampania.btapp;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
public class ConnectedThread extends Thread{
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public static final int RESPONSE_MESSAGE = 10;
Handler uih;
public ConnectedThread(BluetoothSocket socket, Handler uih){
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
this.uih = uih;
Log.i("[THREAD-CT]","Creating thread");
try{
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch(IOException e) {
Log.e("[THREAD-CT]","Error:"+ e.getMessage());
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
try {
mmOutStream.flush();
} catch (IOException e) {
return;
}
Log.i("[THREAD-CT]","IO's obtained");
}
public void run(){
//byte[] buffer = new byte[1024];
//int bytes;
BufferedReader br = new BufferedReader(new InputStreamReader(mmInStream));
Log.i("[THREAD-CT]","Starting thread");
while(true){
try{
// bytes = mmInStream.read(buffer);
String resp = br.readLine();
//Transfer these data to the UI thread
Message msg = new Message();
msg.what = RESPONSE_MESSAGE;
msg.obj = resp;
uih.sendMessage(msg);
}catch(IOException e){
break;
}
}
Log.i("[THREAD-CT]","While loop ended");
}
public void write(byte[] bytes){
try{
Log.i("[THREAD-CT]", "Writting bytes");
mmOutStream.write(bytes);
}catch(IOException e){}
}
public void cancel(){
try{
mmSocket.close();
}catch(IOException e){}
}
}
package com.unicampania.btapp;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import java.io.IOException;
import java.util.UUID;
import androidx.appcompat.app.AppCompatActivity;
public class Main extends AppCompatActivity {
public final static String MODULE_MAC = "98:D3:34:90:6F:A1";
public final static int REQUEST_ENABLE_BT = 1;
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
BluetoothAdapter bta;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
ConnectedThread btt = null;
Button switchLight, switchRelay;
TextView response;
boolean lightflag = false;
boolean relayFlag = true;
public Handler mHandler;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ardcon);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Log.i("[BLUETOOTH]", "Creating listeners");
response = (TextView) findViewById(R.id.response);
switchRelay = (Button) findViewById(R.id.relay);
switchLight = (Button) findViewById(R.id.switchlight);
switchLight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("[BLUETOOTH]", "Attempting to send data");
if (mmSocket.isConnected() && btt != null) { //if we have connection to the bluetoothmodule
if (!lightflag) {
String sendtxt = "LY";
btt.write(sendtxt.getBytes());
lightflag = true;
} else {
String sendtxt = "LN";
btt.write(sendtxt.getBytes());
lightflag = false;
}
} else {
Toast.makeText(Main.this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}
});
switchRelay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("[BLUETOOTH]", "Attempting to send data");
if (mmSocket.isConnected() && btt != null) { //if we have connection to the bluetoothmodule
if(relayFlag){
String sendtxt = "RY";
btt.write(sendtxt.getBytes());
relayFlag = false;
}else{
String sendtxt = "RN";
btt.write(sendtxt.getBytes());
relayFlag = true;
}
//disable the button and wait for 4 seconds to enable it again
switchRelay.setEnabled(false);
new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(4000);
}catch(InterruptedException e){
return;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
switchRelay.setEnabled(true);
}
});
}
}).start();
} else {
Toast.makeText(Main.this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}
});
bta = BluetoothAdapter.getDefaultAdapter();
//if bluetooth is not enabled then create Intent for user to turn it on
if(!bta.isEnabled()){
Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT);
}else{
initiateBluetoothProcess();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode == REQUEST_ENABLE_BT){
initiateBluetoothProcess();
}
}
public void initiateBluetoothProcess(){
if(bta.isEnabled()){
//attempt to connect to bluetooth module
BluetoothSocket tmp = null;
mmDevice = bta.getRemoteDevice(MODULE_MAC);
//create socket
try {
tmp = mmDevice.createRfcommSocketToServiceRecord(MY_UUID);
mmSocket = tmp;
mmSocket.connect();
Log.i("[BLUETOOTH]","Connected to: "+mmDevice.getName());
}catch(IOException e){
try{mmSocket.close();}catch(IOException c){return;}
}
Log.i("[BLUETOOTH]", "Creating handler");
mHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
if(msg.what == ConnectedThread.RESPONSE_MESSAGE){
String txt = (String)msg.obj;
if(response.getText().toString().length() >= 30){
response.setText("");
response.append(txt);
}else{
response.append("\n" + txt);
}
}
}
};
Log.i("[BLUETOOTH]", "Creating and running Thread");
btt = new ConnectedThread(mmSocket,mHandler);
btt.start();
}
}
}
构建.gradle
plugins {
id 'com.android.application'
}
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.unicampania.btapp"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {
checkReleaseBuilds false
}
}
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'android.arch.navigation:navigation-fragment:1.0.0'
implementation 'android.arch.navigation:navigation-ui:1.0.0'
implementation 'androidx.appcompat:appcompat:1.2.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.unicampania.btapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- Include required permissions for Google Maps API to run. -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:testOnly="true"
android:theme="@style/AppTheme"
tools:replace="android:appComponentFactory"
>
<activity
android:name=".Main"
android:label="@string/title_activity_btapp"
android:theme="@style/AppTheme.NoActionBar"
tools:ignore="Instantiatable">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Needs to be explicitly declared on P+ -->
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
</application>
</manifest>
解决方案
推荐阅读
- r - R - 从 tapply 输出中绘制数据
- php - 在 WordPress 的 PHP 插件中添加图像
- oracle-apex - Apex Oracle:如何获取图像 URL?
- java - 处理透明度是否支持去除背景?
- c - c中char数组和字符串的内存位置
- fonts - Godot RichTextLabel 中缺少一些字母
- android - 以编程方式对齐 TableRow 内的 TextView
- google-chrome-extension - 如何保持谷歌浏览器扩展弹出窗口打开?
- tensorflow - Jupyter Notebook 和命令提示符中显示了不同版本的 tensorflow
- python - Numpy 通过将原始元素重复到第 2/3 轴从 1D 数组创建 3D 数组