Android Studio 2024 小米便签项目摆设
目次前言
一、软件安装
二、下载小米便签项目源码
三、新建项目工程
四、将下载的项目源码导入到Android项目的对应目次及文件下
五、解决错误
六、摆设假造机
七、项目展示
前言
经过一学期的学习,《软件工程》这门课程已靠近尾声。由此,老师给我们布置了一个实践使命——小米便签项目。具体是由小组合作,摆设项目和上传长途git仓库。因为在实践完成过程中发现会出现很多问题,故编写这这篇博客,用来记录问题。希望也能帮到大家,谢谢!
一、软件安装
这里先容下我用的Android Studio的版本是2024.2.1,SDK版本为API 24,Gradle版本为8.9。
Android Studio官网下载链接https://developer.android.google.cn/studio?hl=en,找到对应版本举行下载,具体的安装方式推荐大家看这篇https://blog.csdn.net/m0_73909612/article/details/137931888。
二、下载小米便签项目源码
首先我们从github上的开源代码仓库上下载小米便签的源码包。下载地点:https://codeload.github.com/MiCode/Notes/zip/master,然后将下载的zip包举行解压。
https://i-blog.csdnimg.cn/direct/5612df48ca6640f4b968ccf73850d407.png
三、新建项目工程
双击打开Android Studio软件,选择New Project,选择Empty Views Activity,新建一个空项目:https://i-blog.csdnimg.cn/direct/aa6934d437f54ba3bb22b0b38f1569f9.png
按照下面图示举行配置:https://i-blog.csdnimg.cn/direct/4aef5eb824104956b391a4d3805935ef.png
新创建好的项目目次如下:
https://i-blog.csdnimg.cn/direct/24ea0c6e89534b589d5ec849ddb50de1.png
四、将下载的项目源码导入到Android项目的对应目次及文件下
把原项目的代码内容搬到新建的项目工程中去:
1.首先把项目 Notes-master\src\net\micode\notes 下的包全部导入 Android Studio 的 net\micode\notes 下:
https://i-blog.csdnimg.cn/direct/fac1aafd672f4eb6be1a5e3fc36ceacb.png
2.把 Notes-master\res 目次下的包全部导入 Android Studio 的 res 中:
(重复的文件选择替换掉这些文件)
https://i-blog.csdnimg.cn/direct/b454235e55e449d6a6e2da4a25041353.png
3.将以下代码导入到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">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Notesmaster"
tools:targetApi="31">
<activity
android:name=".ui.NotesListActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="adjustPan"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.NoteEditActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/NoteTheme"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.INSERT_OR_EDIT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.item/text_note" />
<data android:mimeType="vnd.android.cursor.item/call_note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
<provider
android:name="net.micode.notes.data.NotesProvider"
android:authorities="micode_notes"
android:multiprocess="true" />
<receiver
android:name=".widget.NoteWidgetProvider_2x"
android:label="@string/app_widget2x2"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_2x_info" />
</receiver>
<receiver
android:name=".widget.NoteWidgetProvider_4x"
android:label="@string/app_widget4x4"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="android.appwidget.action.APPWIDGET_DELETED" />
<action android:name="android.intent.action.PRIVACY_MODE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_4x_info" />
</receiver>
<receiver android:name=".ui.AlarmInitReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<receiver
android:name="net.micode.notes.ui.AlarmReceiver"
android:process=":remote" >
</receiver>
<activity
android:name=".ui.AlarmAlertActivity"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Holo.Wallpaper.NoTitleBar" >
</activity>
<activity
android:name="net.micode.notes.ui.NotesPreferenceActivity"
android:label="@string/preferences_title"
android:launchMode="singleTop"
android:theme="@android:style/Theme.Holo.Light" >
</activity>
<service
android:name="net.micode.notes.gtask.remote.GTaskSyncService"
android:exported="false" >
</service>
<meta-data
android:name="android.app.default_searchable"
android:value=".ui.NoteEditActivity" />
<!-- <activity-->
<!-- android:name=".MainActivity"-->
<!-- android:exported="true">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity>-->
</application>
</manifest> 五、解决错误
导入完成之后,点击小锤子(Make Model '......')构建项目,然后本次实践使命的重头戏来了,你会发现有很多报错,解决一个来一个。不要慌,我们一个一个来解决:
1.依靠下载:
源码依靠于一个httpcomponents-client组件,以执行网络服务,这里我们需要去下载依靠:
下载链接:https://dlcdn.apache.org//httpcomponents/httpclient/binary/httpcomponents-client-4.5.14-bin.zip
然后将下载好后的zip包解压放在下一目次:
https://i-blog.csdnimg.cn/direct/bc7cab68941d497ab76be4cb507f712a.png
在Android Studio中导入依靠:
选择选择File -> Project Structure ->Dependencies-> All Dependencies -> +->https://i-blog.csdnimg.cn/direct/b73d37941f2e43e7b4d731f82cd69942.png
填写绝对路径,这里根据自己下载的依靠库路径填写。
https://i-blog.csdnimg.cn/direct/8ce7effbc8e64a3784784dabf7caa90b.png
导入后,会发现build.gradle多了以下内容:
https://i-blog.csdnimg.cn/direct/e2273ca67f604e0b8790014b90cbfcf2.png
2.报错:找不到符号 notification.setLatestEventInfo...
这时,会出现以下错误:
错误: 找不到符号 notification.setLatestEventInfo(......)
D:\Code\AndroidCode\Notesmaster\app\src\main\java\net\micode\notes\gtask\remote\GTaskASyncTask.java:80: 错误: 找不到符号
notification.setLatestEventInfo(mContext, mContext.getString(R.string.app_name), content,
^
符号: 方法 setLatestEventInfo(Context,String,String,PendingIntent)
位置: 类型为Notification的变量 notification
https://i-blog.csdnimg.cn/direct/8f6418695da34d90bf82316c0e11e066.png
解决方法==>解释以下代码:https://i-blog.csdnimg.cn/direct/0878ce85843f4173a4adade52a090f45.png
修改为:
private void showNotification(int tickerId, String content) {
PendingIntent pendingIntent;
if (tickerId != R.string.ticker_success) {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesPreferenceActivity.class), PendingIntent.FLAG_IMMUTABLE);
} else {
pendingIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext,
NotesListActivity.class), PendingIntent.FLAG_IMMUTABLE);
}
Notification.Builder builder = new Notification.Builder(mContext)
.setAutoCancel(true)
.setContentTitle(mContext.getString(R.string.app_name))
.setContentText(content)
.setContentIntent(pendingIntent)
.setWhen(System.currentTimeMillis())
.setOngoing(true);
Notification notification=builder.getNotification();
mNotifiManager.notify(GTASK_SYNC_NOTIFICATION_ID, notification);
} 3.报错:switch语句报错Constant expression required
D:\Code\AndroidCode\Notesmaster\app\src\main\java\net\micode\notes\ui\NoteEditActivity.java:511: 错误: 需要常量表达式
case R.id.menu_new_note: https://i-blog.csdnimg.cn/direct/1a8de30534524805ae3f6d1576d38efe.png
解决办法参考链接:https://blog.csdn.net/mjh1667002013/article/details/134763804
4.报错:jar包冲突
https://i-blog.csdnimg.cn/direct/610c8e3e7e7c4450916ba19466cd15f2.png
这里是因为我们刚才导入的依靠包有问题,所以在build.gradle里举行修改:
这部分代码有误
https://i-blog.csdnimg.cn/direct/e2273ca67f604e0b8790014b90cbfcf2.png
修改成:
dependencies {
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.activity)
implementation(libs.constraintlayout)
implementation(files("E:\\\\mi\\\\Notesmaster\\\\httpcomponents-client-4.5.14-bin\\lib\\httpclient-osgi-4.5.14.jar"))
implementation(files("E:\\\\mi\\\\Notesmaster\\\\httpcomponents-client-4.5.14-bin\\lib\\httpclient-win-4.5.14.jar"))
implementation(files("E:\\\\mi\\\\Notesmaster\\\\httpcomponents-client-4.5.14-bin\\lib\\httpcore-4.4.16.jar"))
testImplementation(libs.junit)
androidTestImplementation(libs.ext.junit)
androidTestImplementation(libs.espresso.core)
} 5.报错:3 files found with path ‘META-INF/DEPENDENCIES’ ...
3 files found with path 'META-INF/DEPENDENCIES'.
Adding a packaging block may help, please refer to
https://developer.android.com/reference/tools/gradle-api/8.3/com/android/build/api/dsl/Packaging
for more information
https://i-blog.csdnimg.cn/direct/8fcfca6267f24d9099f79da7a69182cb.png
解决办法:在build.gradle(Module:app)的android字段内里,加上这段代码,排除掉冲突的体系依靠包即可:
packaging {
resources.excludes.add("META-INF/DEPENDENCIES");
resources.excludes.add("META-INF/NOTICE");
resources.excludes.add("META-INF/LICENSE");
resources.excludes.add("META-INF/LICENSE.txt");
resources.excludes.add("META-INF/NOTICE.txt");
} 六、摆设假造机
到这里,项目摆设完成了,我们再次点击Make Module 这个小锤子,终于没有出现报错信息了。
https://i-blog.csdnimg.cn/direct/d383122d53554306a921d1f13fbfcdf3.png
接下来:我们开始摆设假造机,依次点击:1->2->3.https://i-blog.csdnimg.cn/direct/43e86ac84a7d4564a1beba1af92e6fd7.png
https://i-blog.csdnimg.cn/direct/08b80a8349684c17aad2c33125355ce0.png
在这个页面,任意选择一个机型:
https://i-blog.csdnimg.cn/direct/b37990324413482a972dfcb692f5d379.png
下一步,选择API,这里你们可以试一下 35/34,我的电脑不知道什么缘故原由选择这两个都会出现冷启动失败,而网上的解决办法我都举行了尝试,无疑都失败了,末了,我尝试使用了低API,如API 24,发现没有报错。
https://i-blog.csdnimg.cn/direct/c9f8a6dc5ab447a1a7177a4025ff243a.png
七、项目展示
末了,点击运行,运行成功!
https://i-blog.csdnimg.cn/direct/58fad306372e4c3ca78c11bc037b2a35.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]