karamuといいます。よろしくおねがいします。String fileName = Environment.getExternalStorageDirectory() +
"/myApp.apk"
;
Intent intent =
new
Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(
new
File(fileName)),
"application/vnd.android.package-archive"
);
startActivity(intent);
上記の手順で、SDカードなどに保存したapkをアプリから更新可能であることは確認できたのですが、
確認画面を出さずに更新は不可能なのでしょうか。
「android.permission.INSTALL_PACKAGES」というパーミッションがあるようなのですが、
これはたとえばプリインされているようなアプリにのみ有効?ということなのでしょうか。
みなさま、ありがとうございます。
「アプリケーションが許可を宣言したのと同じ証明書で署名されたアプリケーションを要求した場合のみ、システムが付与する許可です。証明書が合致したとき、システムはユーザに通知しないで、またはユーザの明示的な受入れを求めることなく、自動的に許可を付与します。 」
のような記載があり、署名つきapkの場合は確認画面がでないのかな?と考えた次第です。
#署名についてはほぼ知識がないので、今から手探りしていく予定です…。
kacodamaさま
kacodamaさまのアドバイスからお試しですが、
MainActivity.javaでボタンを押してinstallPackageを実施するようにしてみました
★箇所でセキュリティで怒られちゃいましたが、
リフレクションで実施しようと試みるところまで作れました。
残念ながら権限がないのでアップデートは行えませんが、
勉強になりました。ありがとうございました。
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.example.test.MainActivity$3.onClick(MainActivity.java:145)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.SecurityException: Neither user xxxxx nor current process has android.permission.INSTALL_PACKAGES.★
at android.os.Parcel.readException(Parcel.java:1425)
at android.os.Parcel.readException(Parcel.java:1379)
at android.content.pm.IPackageManager$Stub$Proxy.installPackage(IPackageManager.java:2297)
at android.app.ApplicationPackageManager.installPackage(ApplicationPackageManager.java:968)
14 more
Kuchinashiさま
Kyash さまversionCodeとversionNameをトースト表示するだけのAPKを作成して確認しました。以下、手順になります。
・エミュレータ起動(APKインストール)
・/data/appから、該当のパッケージ名-1.apk削除
・ランチャーからアイコンが削除される
・/data/appにAKPをPUSH
→ランチャーにアイコンが表示
・アイコンクリック
→Exceptionが発生しましたE/Trace(9589): error opening trace file: No such file or directory (2)
W/asset(9589): Asset path /data/app/com.example.hello-2.apk is neither a directory nor file (type=1).
W/asset(9589): Asset path /data/app/com.example.hello-2.apk is neither a directory nor file (type=1).
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x40a13300)
E/AndroidRuntime(9589): FATAL EXCEPTION: main
E/AndroidRuntime(9589): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.hello/com.example.hello.MainActivity}: java.lang.ClassNotFoundException: com.example.hello.MainActivityKyashさまの行った手順と異なりますでしょうか?
Kyashさまエミュレータ起動によるAPKインストールをやめて
インストールしていない状態(/data/app/に該当のapkがない状態)で、
/data/app/にAPKをPUSHするようにしました。
versionCode1のものとversionCode2のものを交互にPUSHすると
値が変わることで更新されていることを確認できました。
あらかじめ
/data/app/に該当のパッケージ名-1.apk
があると、それを削除→APKをPUSHする手順では、やはりexceptionが発生してしまいましたが…。
次に、アプリ内でファイルコピーするように変更しました。
なんとなく起動中のアプリのAPKを書き換えるのは…と思い、
ボタン押すと、別のアプリを起動させ、その中でAPKを書き換えるようにしました。
その際、更新したいAPKのアプリを終了させています。(というかKILLしてます)
/data/appにコピーされたAPKとコピーしたAPKを比べると同一ファイルでしたが、
何故か、ランチャーからアイコンが消え、設定からアプリは確認できたのですが
古いバージョンのままでした。しかし、書き換え用のアプリの中で2回書き換えると更新されました。。。
タイミングの問題でしょうか。。。
アプリのインストール、アンインストールをReceiverで受けれたような気がするので、
/data/appに直接コピーした場合も受け取れるのか試してみたいと思います。
みなさま、
長々とお付き合いいただきまして、本当にありがとうございました。